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.emp
ty();
empty() 是 O(1)return stk.empty(); // 循环结束后唯一出口栈的语义就是“后进先出”,而括号匹配本质就是“最后一个开括号,必须对应下一个闭括号”。任何绕过栈结构的简化逻辑,都会在嵌套与交叉场景下失效。