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

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>。
  • 逻辑缺失:代码没有实现运算符优先级判断逻辑,也没有正确实现括号的匹配出栈规则,即使修复崩溃问题也无法得到正确的后缀表达式结果。
修复要点
  1. 为每个switch的case分支补充对应的break语句,避免分支穿透,更稳妥的方式是废弃不合理的switch结构,直接按中缀转后缀的标准规则逐字符判断处理。
  2. 调整括号处理逻辑:遇到左括号(直接压栈;遇到右括号)时,循环弹出栈内元素追加到结果串,直到碰到栈顶的左括号,弹出左括号即可,不要把左右括号加入结果串,也不要把右括号压入栈。
  3. 补充运算符优先级判断逻辑:遍历到运算符时,只要栈顶运算符优先级大于等于当前运算符,就弹出栈顶运算符追加到结果串,直到栈空或栈顶为左括号,再把当前运算符压栈。
  4. 将栈类型修改为stack<char>匹配存储的字符类运算符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 00:24:44