Решаем задачи Python. Джеймс Девис
Чтение книги онлайн.
Читать онлайн книгу Решаем задачи Python - Джеймс Девис страница 5
stack = []
operators = {'+': lambda x, y: x + y,
'-': lambda x, y: x – y,
'*': lambda x, y: x * y,
'/': lambda x, y: x / y}
for token in expression:
if token.isdigit():
stack.append(int(token))
elif token in operators:
operand2 = stack.pop()
operand1 = stack.pop()
result = operators[token](operand1, operand2)
stack.append(result)
return stack[0]
# Пример использования:
expression = "53+"
result = calculate(expression)
print("Результат вычислений:", result)
```
Объяснения к коду:
1. Функция `calculate` принимает строку обратной польской записи и возвращает результат вычислений.
2. Создается пустой стек `stack` для хранения операндов.
3. Словарь `operators` содержит операторы и соответствующие им функции для выполнения операций.
4. В цикле `for` происходит итерация по каждому символу в строке.
5. Если символ является числом, он добавляется в стек как операнд.
6. Если символ является оператором, из стека извлекаются два операнда, выполняется операция и результат помещается обратно в стек.
7. После завершения итерации, в стеке остается только один элемент – результат вычислений, который возвращается функцией.
Пусть у нас есть следующее выражение: "5 3 + 8 * 4 /".
Чтобы вычислить это выражение в обратной польской записи, мы будем использовать алгоритм, описанный ранее:
1. Создаем пустой стек.
2. Итерируемся по каждому символу в выражении.
3. Если символ – число, помещаем его в стек.
4. Если символ – оператор, извлекаем из стека нужное количество операндов, выполняем операцию и помещаем результат обратно в стек.
5. После завершения итерации, в стеке должен остаться только один элемент – результат вычислений.
Применяя этот алгоритм к нашему выражению, мы получим:
1. Помещаем 5 в стек.
2. Помещаем 3 в стек.
3. Встречаем оператор "+", извлекаем из стека 3 и 5, выполняем операцию сложения и помещаем результат (8) обратно в стек.
4. Помещаем 8 в стек.
5. Помещаем 4 в стек.
6. Встречаем оператор "*", извлекаем из стека 4 и 8, выполняем операцию умножения и помещаем результат (32) обратно в стек.
7. Помещаем 32 в стек.
8. Встречаем оператор "/", извлекаем из стека 32 и 4, выполняем операцию деления и помещаем результат (8) обратно в стек.
После завершения итераций, в стеке остается только один элемент – результат вычислений, который равен 8.
Давайте напишем код для вычисления выражения в обратной польской записи:
```python
def evaluate_reverse_polish_notation(expression):
stack = []
operators = {'+': lambda x, y: x + y,
'-': lambda x, y: x – y,
'*': lambda x, y: x * y,
'/': lambda x, y: x / y}
for token in expression.split():