我的程序应该评估给定的中缀表达式并对其进行评估。假设只有代码底部的方法调用中的运算符才会用于程序运行的任何给定的中缀表达式。
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。什么缺陷使我的代码工作不正确?
第三次电话中的–
字符:
print(infixToValue('15 + 16 – 2 + 7 * 3 * 2 – 14'))
实际上是Unicode U + 2013字符(简称)。
如果用ASCII -
标志替换两个短划线字符,您的代码将正常工作:
print(infixToValue('15 + 16 - 2 + 7 * 3 * 2 - 14'))