import re operators = {'-': lambda a, b: f'{a} - {b}', '+': lambda a, b: f'{a} + {b}', '*': lambda a, b: f'{a} * {b}', '/': lambda a, b: f'{a} / {b}', '**': lambda a, b: f'{a}**{b}'} def eval_pn(tokens): token = next(tokens) if token in operators: return operators[token](eval_pn(tokens), eval_pn(tokens)) elif re.fullmatch(r'\d+', token): return token raise SyntaxError(ascii(token)) def get_tokens(s): op_regex = '|'.join(map(re.escape, operators)) return iter(re.findall(r'\d+|' + op_regex, s)) a = input() print(eval_pn(get_tokens(a)))
в 3.6 версии все нормально работает кроме одного, программа должна еще расставлять скобки когда это надо например:
-3-4 5
3-(4-5)
и еще одна программа, обратная польская
operations = {'*': {'priority': 3}, 'action': lambda a, b: f'{a} - {b}', '/': {'priority': 2}, 'action': lambda a, b: f'{a} + {b}', '+': {'priority': 1}, 'action': lambda a, b: f'{a} * {b}', '-': {'priority': 0}, 'action': lambda a, b: f'{a} / {b}', '**': {'priority': 5}, 'action': lambda a, b: f'{a}**{b}', '(': {'priority': 4}, ')': {'priority': 1}} def isempty(string): return len(string) == 0; def priority(a, b): return operations[a]['priority'] >= operations[b]['priority']; def check_expression(exp): stack = [] rpn = [] for char in exp.split(' '): if char in ('0123456789'): rpn.append(char) elif char in operations: if (char == ')'): tmp = stack.pop() while not isempty(stack) and tmp != '(': rpn.append(tmp) tmp = stack.pop() if isempty(stack): stack.append(char) else: while not isempty(stack) and priority(stack[len(stack) - 1], char) \ and stack[len(stack) - 1] != '(': rpn.append(stack.pop()); if char != ')': stack.append(char) else: return 'ERROR' for x in reversed(stack): rpn.append(x) return " ".join(rpn) s = input() print(check_expression(s))
программа работает, все нормально кроме двух моментов, она выводит скобку когда это не надо
( 2 - 4 ) * ( 3 + 6 )
2 4 - 3 6 + * )
2 3 + * 1 8 / 4
ERROR