Моя программа должна оценивать данные инфиксные выражения и оценивать их.Предполагается, что только операторы в вызовах методов в нижней части кода будут использоваться для любых заданных инфиксных выражений, которые будут запускаться программой.
from pythonds.basic.stack import Stack
import operator
def infixToValue(expr):
prec = {}
prec["*"] = 3
prec["/"] = 3
prec["+"] = 2
prec["-"] = 2
prec["≤"] = 1
prec["$"] = 0
opStack = Stack()
valStack = Stack()
ops = {"+": operator.add, "-": operator.sub, "*": operator.mul, "/": operator.truediv, "≤": operator.le}
opList = ["+", "-", "*", "/", "≤"]
tokens = expr.split()
def doOp():
x = int(valStack.pop())
y = int(valStack.pop())
op = ops[opStack.pop()]
valStack.push(op(x, y))
def repeatOps(refOp):
while valStack.size() > 1 and opStack.size() > 0 and prec[refOp] <= prec[opStack.peek()]:
doOp()
for token in tokens:
if token.isdigit():
valStack.push(token)
else:
repeatOps(token)
opStack.push(token)
repeatOps("$")
return valStack.pop()
print(infixToValue('14 - 3 * 2 + 7'))
print(infixToValue('14 ≤ 4 - 3 * 2 + 7'))
print(infixToValue('15 + 16 – 2 + 7 * 3 * 2 – 14'))
Текущий вывод следующий:
C:\Users\skarl\AppData\Local\Programs\Python\Python37\python.exe C:/Users/skarl/PycharmProjects/Project02/Root.py
Traceback (most recent call last):
File "C:/Users/skarl/PycharmProjects/Project02/Root.py", line 40, in <module>
-1
print(infixToValue('15 + 16 – 2 + 7 * 3 * 2 – 14'))
True
File "C:/Users/skarl/PycharmProjects/Project02/Root.py", line 32, in infixToValue
repeatOps(token)
File "C:/Users/skarl/PycharmProjects/Project02/Root.py", line 25, in repeatOps
while valStack.size() > 1 and opStack.size() > 0 and prec[refOp] <= prec[opStack.peek()]:
KeyError: '–'
Process finished with exit code 1
Кажется, что -1 является результатом для первого выражения инфикса, которое является арифметически неверным, а также KeyError для my "-" во втором выражении, на которое ссылается первое выражение инфикса.Какие недостатки делают мой код некорректно работающим?