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

Python栈实现后缀表达式求值异常:测试用例'234*-'结果不符

问题排查与修复

错误核心

你的代码在处理减法和除法时,操作数的顺序完全搞反了。栈是后进先出的结构,以测试用例'234*-'为例:

  1. 依次入栈2、3、4,栈内为[2,3,4]
  2. 遇到*,弹出4和3,计算3*4=12压栈,栈内为[2,12]
  3. 遇到-,你的代码执行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 23:40:42