Reverse Polish notation calculator

import re

def infix_to_postfix(expression):
    precedence = {'+': 1, '-': 1, '*': 2, '/': 2, '(': 0, ')': 0}
    output = []
    operators = []
    tokens = re.findall(r'\d+|[+\-*/()]', expression)
    
    for token in tokens:
        if token.isdigit():
            output.append(token)
        elif token == '(':
            operators.append(token)
        elif token == ')':
            while operators and operators[-1] != '(':
                output.append(operators.pop())
            operators.pop()
        else:
            while (operators and precedence[operators[-1]] >= precedence[token]):
                output.append(operators.pop())
            operators.append(token)
    
    while operators:
        output.append(operators.pop())
    return output

def evaluate_postfix(postfix):
    stack = []
    for token in postfix:
        if token.isdigit():
            stack.append(int(token))
        else:
            b, a = stack.pop(), stack.pop()
            if token == '+': stack.append(a + b)
            elif token == '-': stack.append(a - b)
            elif token == '*': stack.append(a * b)
            elif token == '/': stack.append(a / b)
    return stack[0]

def main():
    while True:
        expr = input("Введите выражение (или 'exit' для выхода): ").replace(' ', '')
        if expr.lower() == 'exit':
            break
        try:
            postfix = infix_to_postfix(expr)
            result = evaluate_postfix(postfix)
            print("Результат:", result)
        except Exception as e:
            print("Ошибка в выражении:", e)

if __name__ == "__main__":
    main()

Комментарии могут быть опубликованы или отклонены после ручной проверки.

Если Вам нужен ответ на вопрос приватно от автора сайта, введите свой реальный email.

Введите марку автомобиля кириллицей!