📌  相关文章
📜  使用堆栈检查表达式(格式良好)中的平衡括号的 C 程序(1)

📅  最后修改于: 2023-12-03 15:06:55.803000             🧑  作者: Mango

使用堆栈检查表达式(格式良好)中的平衡括号的 C 程序

在编写程序时,括号的使用是非常重要的,不良的括号使用会导致程序的错误。因此,检查表达式中的平衡括号是一项必要的任务。这里介绍一种使用堆栈来检查表达式中的平衡括号的 C 程序。

程序思路

该程序使用堆栈来管理符号,遇到左括号(圆括号、方括号或大括号)则将其压入堆栈中。当遇到右括号时,从堆栈中弹出相应的左括号,并检查它们是否匹配。如果不匹配,则表达式中存在不良括号使用。如果在所有括号都处理完后堆栈不为空,则表达式也存在不良括号使用。

代码实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_STACK_SIZE 100

typedef struct {
    char items[MAX_STACK_SIZE];
    int top;
} Stack;

void initStack(Stack *stack) {
    stack->top = -1;
}

int isStackEmpty(Stack *stack) {
    return stack->top == -1;
}

int isStackFull(Stack *stack) {
    return stack->top == MAX_STACK_SIZE - 1;
}

void push(Stack *stack, char c) {
    if (isStackFull(stack)) {
        fprintf(stderr, "Stack is full.\n");
        exit(EXIT_FAILURE);
    }

    stack->top++;
    stack->items[stack->top] = c;
}

char pop(Stack *stack) {
    if (isStackEmpty(stack)) {
        fprintf(stderr, "Stack is empty.\n");
        exit(EXIT_FAILURE);
    }

    char c = stack->items[stack->top];
    stack->top--;
    return c;
}

char peek(Stack *stack) {
    if (isStackEmpty(stack)) {
        fprintf(stderr, "Stack is empty.\n");
        exit(EXIT_FAILURE);
    }

    return stack->items[stack->top];
}

int isBalanced(char *expression) {
    Stack stack;
    initStack(&stack);

    for (int i = 0; i < strlen(expression); i++) {
        char c = expression[i];

        switch (c) {
            case '(':
            case '[':
            case '{':
                push(&stack, c);
                break;
            case ')':
                if (isStackEmpty(&stack) || pop(&stack) != '(') {
                    return 0;
                }
                break;
            case ']':
                if (isStackEmpty(&stack) || pop(&stack) != '[') {
                    return 0;
                }
                break;
            case '}':
                if (isStackEmpty(&stack) || pop(&stack) != '{') {
                    return 0;
                }
                break;
            default:
                break;
        }
    }

    return isStackEmpty(&stack);
}

int main() {
    char expression[MAX_STACK_SIZE + 1];

    printf("Enter an expression: ");
    gets(expression);

    if (isBalanced(expression)) {
        printf("The expression is balanced.\n");
    } else {
        printf("The expression is not balanced.\n");
    }

    return 0;
}
代码分析

程序使用 Stack 结构体来定义堆栈,每个元素包含一个字符数组和一个 top 变量表示栈顶的位置。initStack 函数初始化堆栈, isStackEmptyisStackFull 函数检查堆栈是否为空和是否已满。push 函数将元素压入堆栈中,pop 函数从堆栈中弹出元素,peek 函数返回堆栈顶部的元素。

isBalanced 函数接受一个表达式字符串作为参数,使用 switch 语句遍历每个字符。遇到左括号直接将其压入堆栈,遇到右括号则从堆栈中弹出相应的左括号并检查它们是否匹配。最后,如果堆栈为空则表达式是平衡的,否则存在不良括号使用。

main 函数中,使用 gets 函数从用户输入中获取表达式,调用 isBalanced 函数检查表达式是否平衡。如果是,则打印 "The expression is balanced.",否则打印 "The expression is not balanced."

代码运行

以示例表达式 ([])[()] 为例:

Enter an expression: ([])[()]
The expression is balanced.

以表达式 ([)] 为例:

Enter an expression: ([)]
The expression is not balanced.
总结

该程序使用堆栈来管理左侧括号,从而实现表达式中的平衡括号检查。