使用堆栈评估中缀表达式时,算术上不正确的评估和KeyDict错误;

时间:2019-03-03 22:51:41

标签: python stack evaluation keyerror infix-notation

我的程序应该对给定的infix表达式求值并求值。假定只有代码底部的方法调用中的运算符将用于程序将运行的任何给定的infix表达式。

1. run DFS on G
2. for each v in V
2.1   for each u in Adj[v]
2.1.1   if v.pi != u
2.1.1.1    if (v.pi,u) is an edge in G
2.1.1.1.1   return TRUE
3. return FALSE

当前输出如下:

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'))

-1似乎是第一个infix表达式的结果,在算术上是不正确的,以及我在第一个infix表达式中引用的第二个表达式上的“-”的KeyError。哪些缺陷使我的代码无法正常工作?

1 个答案:

答案 0 :(得分:1)

您的第三个通话中的个字符:

print(infixToValue('15 + 16 – 2 + 7 * 3 * 2 – 14'))

实际上是Unicode U + 2013字符(破折号)。

如果您将两个破折号字符都替换为ASCII -符号,则您的代码会正常工作:

print(infixToValue('15 + 16 - 2 + 7 * 3 * 2 - 14'))