📅  最后修改于: 2023-12-03 15:06:55.803000             🧑  作者: Mango
在编写程序时,括号的使用是非常重要的,不良的括号使用会导致程序的错误。因此,检查表达式中的平衡括号是一项必要的任务。这里介绍一种使用堆栈来检查表达式中的平衡括号的 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
函数初始化堆栈, isStackEmpty
和 isStackFull
函数检查堆栈是否为空和是否已满。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.
该程序使用堆栈来管理左侧括号,从而实现表达式中的平衡括号检查。