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
相关产品推荐
相关产品推荐

