为何我的逆波兰表示法程序输出结果错误?附相关代码
排查逆波兰表示法程序的输出错误
我帮你梳理下这段代码里的几个关键问题,这些应该就是导致输出错误的根源:
未初始化的变量拖后腿
变量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的循环连个退出条件都没有,很容易陷入死循环或者跑错分支。
给你几个修复的方向
- 先把数字输入的处理补上:当
input是'0'到'9'的时候,把字符转成整数累积到X里(比如X = X * 10 + (input - '0'))。 - 把
buffer改成标准的栈结构,用个top变量标记栈顶位置(初始设成-1,压栈时top++,把数字存到buffer[top];出栈时先取buffer[top],再top--)。 - 处理运算符时严格按栈的规则来:比如遇到
+,先弹出栈顶的两个数b和a,计算a + b,再把结果压回栈里。 - 尽量去掉不必要的
goto,用while循环替代,代码流程会清晰很多。 - 所有变量在使用前都要初始化,比如
X初始为0,top初始为-1之类的。
内容的提问来源于stack exchange,提问作者Servus
相关产品推荐
相关产品推荐

