Question and Answer from L4-M1
def precedence(op):
if op in ('+', '-'):
return 1
if op in ('*', '/'):
return 2
return 0
def apply_op(a, b, op):
if op == '+': return a + b
if op == '-': return a - b
if op == '*': return a * b
if op == '/': return a // b # integer division as per typical CP problems
def evaluate(tokens):
values = []
ops = []
i = 0
while i < len(tokens):
if tokens[i] == ' ':
i += 1
continue
elif tokens[i] == '(':
ops.append(tokens[i])
elif tokens[i].isdigit():
val = 0
while i < len(tokens) and tokens[i].isdigit():
val = val * 10 + int(tokens[i])
i += 1
values.append(val)
i -= 1
elif tokens[i] == ')':
while ops and ops[-1] != '(':
b = values.pop()
a = values.pop()
op = ops.pop()
values.append(apply_op(a, b, op))
ops.pop() # remove '('
else:
while ops and precedence(ops[-1]) >= precedence(tokens[i]):
b = values.pop()
a = values.pop()
op = ops.pop()
values.append(apply_op(a, b, op))
ops.append(tokens[i])
i += 1
while ops:
b = values.pop()
a = values.pop()
op = ops.pop()
values.append(apply_op(a, b, op))
return values[-1]
# Read the whole expression as a single line
expr = input().strip()
print(evaluate(expr))