表达式的后缀求值

Postfix evaluation of an expression

此代码存在一些问题,因为它不返回负结果,只返回正部分。

我不明白为什么它不按照输入附加最后一个值及其符号(如果有)。

from collections import deque

ex = '231*+9-'
q = deque()

for i in ex:
    if i.isdigit():
        q.append(i)
    else:
        a= q.pop()
        b= q.pop()
        q.append(str(eval(a + i + b)))
print(q)

为了调试暂时修改你的代码:

from collections import deque

ex = '231*+9-'
q = deque()

for i in ex:
    if i.isdigit():
        q.append(i)
    else:
        a = q.pop()
        b = q.pop()
        q.append(str(eval(a + i + b)))
    print('debug:', i, q)               # Just add this line.
print(q)

您将能够更清楚地看到正在发生的事情:

debug: 2 deque(['2'])
debug: 3 deque(['2', '3'])
debug: 1 deque(['2', '3', '1'])
debug: * deque(['2', '3'])
debug: + deque(['5'])
debug: 9 deque(['5', '9'])
debug: - deque(['4'])
deque(['4'])

因此您可以看到它似乎大部分都在工作。如果您希望它在最后一步中从 5 中减去 9(这似乎是基于 RPN 的使用),那么您的变量顺序错误。他们应该是:

b = q.pop() # Swap these
a = q.pop() #   two around.
q.append(str(eval(a + i + b)))

实际上,您将 9 放入 a 并将 5 放入 b,然后计算 a - b9 - 5.按照建议修复它可以得到:

debug: 2 deque(['2'])
debug: 3 deque(['2', '3'])
debug: 1 deque(['2', '3', '1'])
debug: * deque(['2', '3'])
debug: + deque(['5'])
debug: 9 deque(['5', '9'])
debug: - deque(['-4'])
deque(['-4'])