from collections import deque
def postfixExpression(expression: str) -> int:
if not expression:
return -1
expression_list = expression.split(" ")
stack = deque()
for ex in expression_list:
print(ex, stack)
try:
stack.append(int(ex))
except ValueError:
b = stack.pop()
a = stack.pop()
switcher = {
"+" : a + b,
"-" : a - b,
"*" : a * b,
"/" : int(a / b),
"^" : a ** b,
}
if ex not in switcher.keys():
raise ValueError(f"Wrong expression-> {ex}")
else:
stack.append(switcher.get(ex))
return stack.pop()
expression = "2 3 7 - 7 + 9 7 2 + - * *"
print(f"\nResult {postfixExpression(expression)}")
上面是一个Python的Postfix评估程序。它适用于大多数情况。
但是当我使用输入 "2 3 7 - 7 + 9 7 2 + - * *" 时,它给出了 ZeroDivisionError,即使我没有在输入中使用divide(/)。
错误信息:
$ python temp/temp.py
4 deque([])
6 deque([4])
* deque([4, 6])
2 deque([24])
1 deque([24, 2])
- deque([24, 2, 1])
+ deque([24, 1])
7 deque([25])
7 deque([25, 7])
+ deque([25, 7, 7])
7 deque([25, 14])
6 deque([25, 14, 7])
+ deque([25, 14, 7, 6])
* deque([25, 14, 13])
* deque([25, 182])
3 deque([4550])
7 deque([4550, 3])
- deque([4550, 3, 7])
7 deque([4550, -4])
+ deque([4550, -4, 7])
9 deque([4550, 3])
7 deque([4550, 3, 9])
2 deque([4550, 3, 9, 7])
+ deque([4550, 3, 9, 7, 2])
- deque([4550, 3, 9, 9])
* deque([4550, 3, 0])
Traceback (most recent call last):
File "C:\Users\...\temp.py", line 11, in postfixExpression
stack.append(int(ex))
ValueError: invalid literal for int() with base 10: '*'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\...\temp.py", line 52, in main
print(f"\nresult {postfixExpression(expression)}")
File "C:\Users\...\temp.py", line 19, in postfixExpression
"/" : int(a / b),
ZeroDivisionError: division by zero
当我评论 "/" : int(a / b), 切换器字典中的行时,它给出了预期的答案,即 0。
任何人都可以解释为什么我会收到此错误(主要)以及如何解决它?
问题是您在设置 switcher
字典时正在评估
所有操作。因此,无论您的代码遇到哪个运算符,它都会计算堆栈顶部两个值的和、差、乘积和商。然后它会查看操作符来决定实际使用哪一个。在这种情况下,您的
b
值为零,因此它确实试图除以零。
有多种方法可以解决此问题,包括(但不限于):
lambda
字典中的switcher
函数,并且只调用需要的函数switch
语句直接在代码中计算适当的值,而不是使用字典(这需要 Python 3.10+)if
-elif
链直接在代码中计算适当的值,而不是使用字典