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

为何我的逆波兰表示法程序输出结果错误?附相关代码

排查逆波兰表示法程序的输出错误

我帮你梳理下这段代码里的几个关键问题,这些应该就是导致输出错误的根源:

  • 未初始化的变量拖后腿
    变量X在使用前完全没初始化,程序启动时它会是内存里的随机垃圾值,不管是数字累积还是后续运算,结果肯定全错。你得在main开头或者第一次用它之前,把X初始化成0。

  • 数字解析逻辑完全缺失还混乱
    你这段代码根本没处理输入是数字字符('0'-'9')的情况!用户输入数字时,程序没有把字符转成对应的整数(比如应该写X = X * 10 + (input - '0')来累积数字),反而直接跑到换行或加号的分支里,X永远拿不到正确的数字值。另外你用power数组处理数字的逻辑完全乱套:tmp = tmp - power[y]; output++;加上L3的循环,不仅没终止条件(当power[y]是0时,tmp >= 0会一直成立,直接死循环),而且完全和数字解析的需求不沾边。

  • 逆波兰核心的栈操作逻辑错得离谱
    逆波兰表达式的核心是栈结构:遇到数字就压栈,遇到运算符就弹出栈顶两个元素(注意顺序:后弹出来的是第一个操作数,先弹的是第二个),算完结果再压回栈里。但你的代码逻辑完全不符合这个规则:

    • 处理加号+时,你写的X = buffer[i] + X不仅顺序搞反了,而且根本没正确实现栈的弹出操作——应该是把栈顶的两个元素取出来计算,结果压回栈顶,而不是直接用X和buffer[i]瞎凑。
    • buffer数组的索引i管理得一团糟,完全没实现栈的入栈(push)和出栈(pop)逻辑,比如换行时的if(buffer[i] > 0){ i++; } buffer[i] = X;完全不是栈该有的行为。
  • 代码不完整还乱用goto
    你给的代码到L3: if(tmp >= power[y]){ goto L3;...就断了,缺失的部分肯定会让程序行为异常。另外goto用得太随意,导致流程根本没法跟踪,比如L2和L3的循环连个退出条件都没有,很容易陷入死循环或者跑错分支。

给你几个修复的方向

  1. 先把数字输入的处理补上:当input是'0'到'9'的时候,把字符转成整数累积到X里(比如X = X * 10 + (input - '0'))。
  2. 把buffer改成标准的栈结构,用个top变量标记栈顶位置(初始设成-1,压栈时top++,把数字存到buffer[top];出栈时先取buffer[top],再top--)。
  3. 处理运算符时严格按栈的规则来:比如遇到+,先弹出栈顶的两个数b和a,计算a + b,再把结果压回栈里。
  4. 尽量去掉不必要的goto,用while循环替代,代码流程会清晰很多。
  5. 所有变量在使用前都要初始化,比如X初始为0,top初始为-1之类的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:54:44