C++实现中缀转后缀程序编译无错但运行无输出问题求助
问题描述
程序编译无任何错误,但运行后无输出。目标是实现中缀表达式转后缀表达式功能,当前调试括号处理逻辑,测试用例infix3 = "(a+b)/c"预期输出后缀表达式结果ab+c/,实际运行无任何输出,原实现代码如下:
#include <iostream> #include <stack> #include <ctype.h> #include <string> using namespace std; string I2PConvertor(string exp); string I2PConvertor(string exp) { stack<int> st; string ans; for (int i = 0; i < exp.size(); i++) { if (isalpha(exp[i])) { ans += exp[i]; } else { if (st.empty()) { st.push(exp[i]); } else { switch (st.top()) { case '(': st.push(exp[i]); case '+': st.push(exp[i]); case ')': { st.pop(); while (st.top() != '(') { ans += st.top(); st.pop(); } st.pop(); st.push(exp[i]); } } } } } while (!st.empty()) { ans += st.top(); st.pop(); } return ans; } int main() { string infix1 = "a*b+c"; string infix2 = "a-b*c"; string infix3 = "(a+b)/c"; string infix4 = "(a+b)*(c-d)"; // expected: ab*c+ //std::cout << I2PConvertor(infix1) << std::endl; // expected: abc*- //std::cout << I2PConvertor(infix2) << std::endl; // expected: ab+c/ std::cout << I2PConvertor(infix3) << std::endl; // expected: ab+cd-* // std::cout << I2PConvertor(infix4) << std::endl; return 0; }
故障原因
- 核心语法错误:
switch结构的所有case分支末尾都遗漏了break关键字,触发C++的switch分支穿透逻辑:匹配到对应case后不会跳出switch结构,会继续顺序执行后续所有case分支的代码。以测试用例(a+b)/c为例,遍历到第一个字符(时栈空直接压栈,后续遍历到+时栈顶是(,匹配case '('分支执行push后,会直接穿透执行case '+'、case ')'分支的代码,在没有遇到右括号的场景下直接执行出栈操作,把栈里的(弹出,栈变为空。 - 内存越界崩溃:穿透执行到case ')'的逻辑后,栈已经被弹空,后续循环判断
st.top() != '('时会直接访问空栈的栈顶,触发未定义行为,程序异常终止,因此控制台没有任何输出。 - 类型定义错误:存储运算符的栈定义为
stack<int>类型,虽然字符可以隐式转为int存储,但后续做运算符优先级判断、字符比对时容易出现非预期的类型匹配问题,应当定义为stack<char>。 - 逻辑缺失:代码没有实现运算符优先级判断逻辑,也没有正确实现括号的匹配出栈规则,即使修复崩溃问题也无法得到正确的后缀表达式结果。
修复要点
- 为每个
switch的case分支补充对应的break语句,避免分支穿透,更稳妥的方式是废弃不合理的switch结构,直接按中缀转后缀的标准规则逐字符判断处理。 - 调整括号处理逻辑:遇到左括号
(直接压栈;遇到右括号)时,循环弹出栈内元素追加到结果串,直到碰到栈顶的左括号,弹出左括号即可,不要把左右括号加入结果串,也不要把右括号压入栈。 - 补充运算符优先级判断逻辑:遍历到运算符时,只要栈顶运算符优先级大于等于当前运算符,就弹出栈顶运算符追加到结果串,直到栈空或栈顶为左括号,再把当前运算符压栈。
- 将栈类型修改为
stack<char>匹配存储的字符类运算符。
内容的提问来源于stack exchange,提问作者sabra baig
相关产品推荐
相关产品推荐

