Как добавить скобки в постфиксную функцию? - PullRequest
0 голосов
/ 17 апреля 2019

Нам нужна скобка для расстановки приоритетов, но мы не должны использовать ее как умножение. Я пытался включить скобки, но не смог сделать это. Я также не могу правильно сформулировать вопрос, извините за это.

def postfix(expr):

    pos = 0
    exp = ""
    tr = list()
    upopr = ""
    number = 0
    oprpos = 0

    opri = {"+": 1, "-": 1, "^": 3, "*": 2, "/": 2}
    #breaks when no operators are left
    while True:
        #when nextNumber returns useable output.
        try:
            number, upopr, oprpos = getNextNumber(expr, pos)
            #if num outnumber opr
        except:
            return "error, invalid expression"
        #if operators outnumber numbers
        if number == None:
            return "error, invalid expression"
        exp += str(number) + " "
        if upopr == None:
            #when empty
            if len(tr)== 1:
                exp += str(tr.pop())
            break
        #setting new starting point
        pos = oprpos + 1
        if len(tr) == 0:
            tr.append(upopr)
        else:
            while len(tr)!=0 and opri[tr[len(tr) - 1]] >= opri[upopr]:
                exp += str(tr.pop()) + " "
            tr.append(upopr)
    #postfix
    return exp.rstrip()

Ожидаемые результаты:

>>> postfix('(2)')
'2.0'
>>> postfix ('2')
'2.0'
>>> postfix ('((2))')
'2.0'
>>> postfix (' 2 * (( 5 + 3) ^ -2+(1 +4)) ')
'2.0 5.0 3.0 + -2.0 ^ 1.0 4.0 + + *'
>>> postfix (' ( 2 * (( 5 + 3) ^ -2+(1 +4))) ')
'2.0 5.0 3.0 + -2.0 ^ 1.0 4.0 + + *'
>>> postfix (' (( 2 * (( 5 + 3) ^ -2+(1 +4)))) ')
'2.0 5.0 3.0 + -2.0 ^ 1.0 4.0 + + *'
>>> postfix(' 2 * ( 5 + 3) ^ -2+(1 +4) ')
'2.0 5.0 3.0 + -2.0 ^ * 1.0 4.0 + +'

Фактические результаты:

Рассчитать ('2 + 3 * (-2 + (- 3) * (5 ^ 2 - 2 * 3 ^ (- 2)) * (- 4)) * (2/8 + 2 * ( 3 - 1/3)) - 2/3 ^ 2 ') ['error,', 'invalid', 'expression'] 'выражение'

...