Python栈实现后缀表达式求值异常:测试用例'234*-'结果不符
问题排查与修复
错误核心
你的代码在处理减法和除法时,操作数的顺序完全搞反了。栈是后进先出的结构,以测试用例'234*-'为例:
- 依次入栈2、3、4,栈内为
[2,3,4] - 遇到
*,弹出4和3,计算3*4=12压栈,栈内为[2,12] - 遇到
-,你的代码执行Stack.pop() - Stack.pop(),也就是先弹出12,再弹出2,计算12-2=10,这和预期的2-12=-10完全相反。
除法同理,正确逻辑应该是后弹出的数作为左操作数,先弹出的作为右操作数。
另外代码里的c.split(" ")是无效代码,没有任何实际作用可以直接删除;最后的else分支逻辑错误,既然已经判断c是运算符,这里再转int压栈会导致报错(比如遇到(时),也应该删掉。
修复后的代码
Stack = ArrayStack() def evaluate(postfix_str, Stack): for c in postfix_str: if c not in '+-*/': # 若需支持括号需补充对应逻辑,当前测试用例无括号可简化 Stack.push(int(c)) else: if c == '+': sum_val = Stack.pop() + Stack.pop() Stack.push(sum_val) elif c == '-': right = Stack.pop() left = Stack.pop() difference = left - right Stack.push(difference) elif c == '*': product = Stack.pop() * Stack.pop() Stack.push(product) elif c == '/': right = Stack.pop() left = Stack.pop() quotient = left / right Stack.push(quotient) return Stack.pop() print(evaluate('234*-', Stack)) # 输出-10,符合预期
额外说明
- 乘法和加法满足交换律,操作数顺序不影响结果,但减法和除法必须严格区分左右操作数顺序。
- 如果需要支持多位数或带空格分隔的后缀表达式,还需要修改遍历逻辑,比如先按空格分割字符串再处理每个元素。
内容的提问来源于stack exchange,提问作者Bella
相关产品推荐
相关产品推荐

