问题是你正在评估
全部的
的操作
switcher
词典因此,无论代码遇到哪种运算符,它都会计算堆栈顶部两个值的和、差、积和商。然后,它查看操作符,以决定实际使用哪一个。在这种情况下,您的
b
值为零,所以它确实试图除以零。
有多种方法可以解决此问题,包括(但不限于):
-
使用
lambda
中的函数
切换器
字典,并且只调用所需的
switcher = {
"+" : lambda: a + b,
"-" : lambda: a - b,
"*" : lambda: a * b,
"/" : lambda: int(a / b),
"^" : lambda: a ** b,
}
if ex not in switcher:
raise ValueError(f"Wrong expression-> {ex}")
else:
stack.append(switcher[ex]()) # <- note the added () here
-
只需使用
match
语句直接在代码中计算适当的值,而不是使用字典(这需要Python 3.10+)
match ex:
case "+":
val = a + b
case "-":
val = a - b
case "*":
val = a * b
case "/":
val = int(a / b)
case "^":
val = a ** b
case _:
raise ValueError(f"Wrong expression-> {ex}")
stack.append(val)
-
使用
if
-
elif
链直接在代码中计算适当的值,而不是使用字典
if ex == "+":
val = a + b
elif ex == "-":
val = a - b
elif ex == "*":
val = a * b
elif ex == "/":
val = int(a / b)
elif ex == "^":
val = a ** b
else:
raise ValueError(f"Wrong expression-> {ex}")
stack.append(val)
在任何情况下,我都建议您将计算操作拉到它自己的函数中,而不是将其嵌入到循环的中间。有点像
def calculate_value(op, a, b):
... # Something based on what I've shown above
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()
stack.append(calculate_value(ex, a, b))
return stack.pop()
应要求:测试代码使用
λ
功能:
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 = {
"+" : lambda: a + b,
"-" : lambda: a - b,
"*" : lambda: a * b,
"/" : lambda: int(a / b),
"^" : lambda: 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)}")
带输出
2 deque([])
3 deque([2])
7 deque([2, 3])
- deque([2, 3, 7])
7 deque([2, -4])
+ deque([2, -4, 7])
9 deque([2, 3])
7 deque([2, 3, 9])
2 deque([2, 3, 9, 7])
+ deque([2, 3, 9, 7, 2])
- deque([2, 3, 9, 9])
* deque([2, 3, 0])
* deque([2, 0])
Result 0