c++中如何实现括号匹配检查_c++栈容器判断括号合法性

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

std::stack 检查括号是否合法

直接结论:C++ 中最简洁、可靠的方式是用 std::stack 遍历字符串,遇左括号入栈,遇右括号检查栈顶是否匹配并弹出。不匹配或遍历完栈非空即非法。

遇到右括号时怎么判断是否匹配

关键在映射关系和栈顶校验。不能只看字符是否为 ')' 就弹栈,必须确认栈非空且栈顶是对应左括号。

  • 常见错误:没检查 stack.empty() 就调用 stack.top() → 触发未定义行为(通常崩溃)
  • 右括号只有三种:')'']''}',每种都要单独比对栈顶
  • 推荐用 if-else if 分支,不用 switch(因为 char 可用,但可读性不如显式比较)
std::stack stk;
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(); // 循环结束后唯一出口
栈的语义就是“后进先出”,而括号匹配本质就是“最后一个开括号,必须对应下一个闭括号”。任何绕过栈结构的简化逻辑,都会在嵌套与交叉场景下失效。