基于C语言栈实现表达式括号匹配检查的问题排查
栈的应用:括号匹配问题修复
问题根源
你的代码核心问题出在pop函数的比较逻辑上:你直接拿右括号(比如))和栈顶的左括号(比如()做相等判断,但这两个字符本身并不相同,导致x == stack[top-1]这个条件永远无法成立,自然无法执行top--来弹出栈顶元素。
修复方案
需要修改pop函数的判断逻辑,让右括号对应匹配的左括号,同时完善不匹配场景的处理,比如栈空时遇到右括号、括号类型不匹配的情况,直接标记为不平衡状态。
修复后的完整代码:
#include <stdio.h> #include <stdbool.h> char stack[30]; int top = 0; bool is_balanced = true; // 标记表达式是否平衡 void push(char x){ if (top == 30) printf("Full\n"); else{ stack[top] = x; top++; } } void pop(char x){ if (top == 0){ // 栈为空时遇到右括号,直接判定不平衡 is_balanced = false; return; } char top_char = stack[top-1]; // 判断当前右括号是否匹配栈顶的左括号 if ((x == ')' && top_char == '(') || (x == '}' && top_char == '{') || (x == ']' && top_char == '[')){ top--; } else { // 括号类型不匹配,标记不平衡 is_balanced = false; } } int main() { char temp[30]; scanf("%s", temp); for (int i = 0; temp[i] != '\0'; i++) { if (!is_balanced) break; // 已确定不平衡,提前终止循环 if (temp[i] == '(' || temp[i] == '{' || temp[i] == '[') push(temp[i]); else if (temp[i] == ')' || temp[i] == '}' || temp[i] == ']') pop(temp[i]); } // 最终判定:栈为空且全程无匹配错误才是平衡的 if (top != 0 || !is_balanced) printf("Unbalanced"); else printf("Balanced"); return 0; }
额外优化说明
- 替换原代码中未实际生效的
spec变量为is_balanced,更直观地追踪匹配状态。 - 新增提前终止逻辑:一旦发现不平衡,直接跳出循环,避免无效遍历。
- 最终判断同时检查栈是否为空和全程是否无匹配错误,避免
([)]这类栈最终为空但实际不匹配的误判。
内容的提问来源于stack exchange,提问作者Ayush Soam
相关产品推荐
相关产品推荐

