Постфиксная оценка выражения - PullRequest
0 голосов
/ 14 апреля 2020

Существует некоторая проблема с этим кодом, так как он не возвращает отрицательные результаты, возвращается только положительная часть.

Я не понимаю, почему он не добавляет последнее значение вместе со знаком ( если есть) согласно вводу.

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)

1 Ответ

0 голосов
/ 14 апреля 2020

Временно измените ваш код таким образом для отладки:

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