Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 7, 2017 18:05:13

shiroi
Зарегистрирован: 2017-10-25
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

из префиксной нотации в инфиксную (и наоборот (2 разные программы))

 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)
но если запускаю в 2.7, то интерпретатор ругается на f в operators, может кто подскажет как с этим бороться?
и еще одна программа, обратная польская
 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
Заранее спасибо

Отредактировано shiroi (Дек. 7, 2017 18:06:06)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version