【问题标题】:Arithmetically incorrect evaluation and KeyDict errors when evaluating infix expression using stacks;使用堆栈评估中缀表达式时出现算术错误评估和 KeyDict 错误;
【发布时间】:2019-07-25 06:08:03
【问题描述】:

我的程序应该评估给定的中缀表达式并评估它们。假设只有代码底部的方法调用中的运算符将用于程序运行的任何给定中缀表达式。

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。哪些缺陷导致我的代码无法正常运行?

【问题讨论】:

    标签: python stack evaluation keyerror infix-notation


    【解决方案1】:

    第三次通话中的 字符:

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

    实际上是 Unicode U+2013 字符(短划线)。

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

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

    【讨论】:

    • 这解决了问题;这是一个将主要代码提供给我们的项目,因此以这种方式复制了它。程序现在完美运行,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-05-02
    • 2015-05-03
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 2020-07-15
    • 2014-07-01
    • 2014-04-14
    相关资源
    最近更新 更多