def evaluate_expression(expr):
precedence = {'+':1, '-':1, '*':2, '/':2}
def apply_op(ops, values):
right = values.pop()
left = values.pop()
op = ops.pop()
if op == '+': values.append(left + right)
elif op == '-': values.append(left - right)
elif op == '*': values.append(left * right)
elif op == '/': values.append(left / right)
ops = []
values = []
i = 0
while i < len(expr):
if expr[i].isdigit():
val = 0
while i < len(expr) and expr[i].isdigit():
val = val * 10 + int(expr[i])
i += 1
values.append(val)
continue
elif expr[i] == '(':
ops.append(expr[i])
elif expr[i] == ')':
while ops and ops[-1] != '(':
apply_op(ops, values)
ops.pop() # remove '('
else:
while ops and ops[-1] != '(' and precedence[ops[-1]] >= precedence[expr[i]]:
apply_op(ops, values)
ops.append(expr[i])
i += 1
while ops:
apply_op(ops, values)
return values[-1]
print(evaluate_expression("3+(2*2)-1"))