You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++括号验证程序空栈访问异常的处理方案咨询

解决括号验证程序的段错误问题

你的代码在处理右括号)时,未检查栈是否为空就直接调用brackets.top(),当栈为空(比如输入())的第三个字符),访问空栈的顶部元素会触发未定义行为,导致段错误或Visual C++中的back() called an empty deque错误。

修正方案

处理右括号时,先判断栈是否为空:

  • 若栈为空,说明当前右括号没有对应的左括号,直接返回false
  • 若栈不为空,再检查栈顶是否为(,确认匹配后再执行弹出操作

修正后的完整代码

#include <iostream>
#include <stack>
#include <string>

using namespace std;

bool valid_brackets(string& expression)
{
    stack<char> brackets;
    for (char c : expression)
    {
        if (c == '(')
            brackets.push(c);
        else if (c == ')')
        {
            // 先检查栈是否为空,避免访问空栈
            if (brackets.empty())
                return false;
            // 再验证栈顶是否是匹配的左括号
            if (brackets.top() != '(')
                return false;
            brackets.pop();
        }
    }
    return brackets.empty();
}
int main()
{
    string expression;
    getline(cin, expression);
    cout << (valid_brackets(expression) ? "Yes" : "No") << endl;
    return 0;
}

测试验证

  • 输入(()):所有括号正确匹配,遍历结束栈为空,输出Yes
  • 输入(():遍历结束栈中剩余一个(,返回false,输出No
  • 输入()):第三个)处理时栈已空,直接返回false,输出No,无错误触发

内容的提问来源于stack exchange,提问作者user17136827

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 01:36:05