Polish Notation String Calculator
S = ( mult ( sub ( add 1 2 3 ) 4 ) 10 5 )
returns: 100, since (((1+2+3)-4)*10*5) = 100import operator as op
map_op = {"add": op.add, "sub": op.sub, "mult": op.mul, "div": op.truediv }
def solve_ops(tokens):
if len(tokens) is 1:
return tokens[0]
else:
stack = []
for index, tok in enumerate(tokens):
if tok is '(':
stack.append(index)
elif tok is ')':
__reduce(stack.pop(), index, tokens)
return solve_ops(tokens)
def __reduce(start, end, tokens):
operator = tokens[start + 1]
nums = [int(tokens[i]) for i in range(start + 2, end)]
sol = nums[0]
for i in range(1, len(nums)):
sol = map_op[operator](sol, nums[i])
del tokens[start:end+1]
tokens.insert(start, sol)
# (((1+2+3)-4)*10*5) = 100
print(solve_ops("( mult ( sub ( add 1 2 3 ) 4 ) 10 5 )".split()))
# (((1-2-3)/4)*2*-5 = 10
print(solve_ops("( mult ( div ( sub 1 2 3 ) 4 ) 2 -5 )".split()))
(((-10+-10)5(2+2))/10/5) = -32
print(solve_ops("( div ( mult ( add -10 -10 ) 5 4 ( add 2 2 ) ) 10 5 )".split()))Last updated