C++中用std::stack检查括号合法性最简洁可靠:遇左括号入栈,遇右括号先判空再比对栈顶并弹出,遍历完须栈为空;计数器无法处理嵌套错位,如"([)]"会误判。

用 std::stack 检查括号是否合法
直接结论:C++ 中最简洁、可靠的方式是用 std::stack 遍历字符串,遇左括号入栈,遇右括号检查栈顶是否匹配并弹出。不匹配或遍历完栈非空即非法。
遇到右括号时怎么判断是否匹配
关键在映射关系和栈顶校验。不能只看字符是否为 ')' 就弹栈,必须确认栈非空且栈顶是对应左括号。
- 常见错误:没检查
stack.empty()就调用stack.top()→ 触发未定义行为(通常崩溃) - 右括号只有三种:
')'、']'、'}',每种都要单独比对栈顶 - 推荐用
if-else if分支,不用switch(因为char可用,但可读性不如显式比较)
std::stackstk; for (char c : s) { if (c == '(' || c == '[' || c == '{') { stk.push(c); } else if (c == ')') { if (stk.empty() || stk.top() != '(') return false; stk.pop(); } else if (c == ']') { if (stk.empty() || stk.top() != '[') return false; stk.pop(); } else if (c == '}') { if (stk.empty() || stk.top() != '{') return false; stk.pop(); } }
为什么不能只用计数器代替栈
计数器(如三个 int 分别统计 (、[、{)只能保证数量平衡,无法捕获嵌套错位问题。
- 输入
"([)]":各括号数量都是 2,但明显非法 —— 计数器会误判为合法 - 输入
"{[}":左括号多于右括号,但最后一个是'}',栈在第三步就因stk.top() == '['≠'}'而返回false -
std::stack天然保留顺序和最近匹配原则,这是括号结构的本质要求
检查完所有字符后还要做什么
必须确认栈为空。否则说明有左括号没被闭合。
立即学习“C++免费学习笔记(深入)”;
- 遗漏这步会导致
"((("、"{[("这类输入被误判为合法 - 不要写成
return true;放在循环末尾 —— 必须显式加return stk.empty(); - 性能无负担:栈大小最多等于字符串长度,
empty()是 O(1)
return stk.empty(); // 循环结束后唯一出口栈的语义就是“后进先出”,而括号匹配本质就是“最后一个开括号,必须对应下一个闭括号”。任何绕过栈结构的简化逻辑,都会在嵌套与交叉场景下失效。











