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

Python实现后缀表达式求值测试用例2报错,求错误原因

后缀表达式求值代码问题定位与修复

核心问题定位

代码报错的根因是类型转换逻辑错误:
Python的int()函数不支持直接转换带小数点的字符串(例如执行int("7.0")会直接抛出ValueError: invalid literal for int() with base 10异常)。
测试用例2执行2/2运算时,Python3的/运算符默认返回浮点数1.0,原有代码将其转为字符串"1.0"压入栈,后续乘法运算得到7.0再转字符串"7.0",最后执行int(self.pop())时触发类型转换报错。

另外原有代码将数值以字符串形式存入栈、拼接表达式调用eval的逻辑,既降低运行效率,也增加了类型转换的风险,属于可优化的设计问题。


修复后可运行代码

class Evaluate:
    def __init__(self, capacity):
        self.top = -1
        self.capacity = capacity
        self.array = []
        
    def isEmpty(self):
        return self.top == -1
    
    def peek(self):
        return self.array[-1]
        
    def pop(self):
        if not self.isEmpty():
            self.top -= 1
            return self.array.pop()
        else:
            return "$"
            
    def push(self, op):
        self.top += 1
        self.array.append(op)
        
    def evaluatePostfix(self, exp):
        for i in exp:
            if i.isdigit():
                # 直接存数值类型,避免字符串转换问题
                self.push(int(i))
            else:
                val1 = self.pop()
                val2 = self.pop()
                # 直接做数值运算,替代eval拼接字符串逻辑
                if i == '+':
                    res = val2 + val1
                elif i == '-':
                    res = val2 - val1
                elif i == '*':
                    res = val2 * val1
                elif i == '/':
                    # 需要整数除法可替换为//
                    res = val2 / val1
                self.push(res)
        # 先转float兼容浮点数场景,再转int避免报错
        return int(float(self.pop()))
        
exp = input('Enter Postfix expression: ')
obj = Evaluate(len(exp))
print("Result of Postfix expression", exp , "is %d" % (obj.evaluatePostfix(exp)))

结果验证

  • 测试用例1输入231*+9-,输出结果为-4,符合预期
  • 测试用例2输入34+22/*,输出结果为7,符合预期,无报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:48:02