Нам нужна скобка для расстановки приоритетов, но мы не должны использовать ее как умножение. Я пытался включить скобки, но не смог сделать это. Я также не могу правильно сформулировать вопрос, извините за это.
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']
'выражение'