Временно измените ваш код таким образом для отладки:
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'])
Следовательно, вы можете видеть, что он выглядит как в основном работать. Если вы ожидали, что на последнем этапе вычтете 9
из 5
(и это, вероятно, основано на использовании RPN), то переменные находятся в неправильном порядке. Они должны быть:
b = q.pop() # Swap these
a = q.pop() # two around.
q.append(str(eval(a + i + b)))
На самом деле, вы помещаете 9
в a
и 5
в b
, затем оцениваете a - b
или 9 - 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'])