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()
def calc(op, a, b): # вычисление одной арифметической операции
return {'+': a.__add__, '-': a.__sub__, '*': a.__mul__, '/': a.__floordiv__}[op](b)
d, o, s = [], '', ''
for ch in input() + '@': # получение чисел и операций
if ch.isdigit(): # цифру добавляем к текущему числу
s += ch
else: # не цифру добавляем в операции, а текущее число запоминаем
d.append(int(s))
o +=ch
s = ''
if o[0] in '+-' and o[1] in '*/': # вторая операция выполняется первой
print(calc(o[0], d[0], calc(o[1], d[1], d[2])))
else: # операции выполняются в порядке появления
print(calc(o[1], calc(o[0], d[0], d[1]), d[2]))
Пример:
Введите выражение:
12*3+45
Ответ: 81
Функцию eval и методы split и replace не использовать!