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
相关产品推荐
相关产品推荐

