C语言栈实现括号匹配程序失效问题求助
修复括号匹配C程序的问题
你的代码存在多个关键问题,导致push/pop从未被调用且结果错误,以下是具体修复方案:
核心问题与修复点
输入读取错误:
原代码用scanf("%d", str);读取字符串,%d是整数格式符,会导致输入的表达式无法正确存入字符数组str,循环里的字符判断全部失效,栈始终为空。应改为scanf("%s", str);。括号匹配逻辑错误:
直接比较str[i] == arr[top]无法匹配括号,因为(和)、{和}、[和]的ASCII值不相等。需要根据右括号对应匹配左括号,比如遇到)时检查栈顶是否为(,以此类推。empty函数优化:
原empty()函数每次调用都会打印栈空信息,干扰输出,且重复调用会多次打印。应移除打印逻辑,让函数仅返回栈是否为空的判断结果,打印操作放在需要的地方。未处理不匹配的右括号:
原代码只处理右括号与栈顶匹配的情况,若不匹配(比如栈顶是(但当前是]),没有直接返回不平衡,会导致错误判断。需在这种情况下直接输出不平衡并退出。其他细节错误:
- 输入提示拼写错误:
Enter he expression改为Enter the expression - push函数的错误提示缺少换行符:
printf("error:stack overflow n");改为printf("error: stack overflow\n"); - main函数中异常退出应返回整数:
return;改为return 1;
- 输入提示拼写错误:
修复后的完整代码
#include <stdio.h> #include <string.h> #define MAX 100 int top = -1; int arr[MAX]; void push(int x) { if (top == (MAX - 1)) { printf("error: stack overflow\n"); return; } top++; arr[top] = x; } void pop() { if (top != -1) { // 防止栈空时执行pop top--; } } int empty() { return top == -1; // 仅返回判断结果,不打印 } int main() { char str[30]; int len, i; printf("Enter the expression\n"); scanf("%s", str); len = strlen(str); for (i = 0; i < len; i++) { if (str[i] == '(' || str[i] == '{' || str[i] == '[') { push(str[i]); } else if (str[i] == ')' || str[i] == '}' || str[i] == ']') { if (empty()) { printf("Unbalanced\n"); return 1; } // 判断当前右括号是否与栈顶左括号匹配 int match = 0; if ((str[i] == ')' && arr[top] == '(') || (str[i] == '}' && arr[top] == '{') || (str[i] == ']' && arr[top] == '[')) { match = 1; } if (match) { pop(); } else { printf("Unbalanced\n"); return 1; } } } if (empty()) { printf("Balanced\n"); } else { printf("Unbalanced\n"); } return 0; }
修复后逻辑说明
- 正确读取输入的表达式字符串,确保循环能遍历每个字符。
- 遇到左括号时压入栈中。
- 遇到右括号时:
- 先检查栈是否为空,为空则说明无匹配的左括号,直接输出不平衡并退出。
- 检查当前右括号与栈顶左括号是否匹配,匹配则弹出栈顶;不匹配则直接输出不平衡并退出。
- 循环结束后,若栈为空说明所有括号都匹配,输出平衡;否则说明有未匹配的左括号,输出不平衡。
内容的提问来源于stack exchange,提问作者tuntun_mausa
相关产品推荐
相关产品推荐

