python
class Solution:
def cal(self, num1, num2, opt):
if opt == '+':
return int(num1) + int(num2)
elif opt == '-':
return int(num1) - int(num2)
elif opt == '*':
return int(num1) * int(num2)
elif opt == '/':
if int(num1) // int(num2) < 0:
return int(int(num1)//int(num2)+1)
return int(num1) // int(num2)
else:
return None
def calculate(self , s ):
# write code here
stack_num = []
stack_opt = []
i = 0
priot = {'(':0, ')':0, '+':1, '-':1, '*':2, '/':2}
s = '(' + s + ')'
s = s.replace('(-', '(0-')
while i < len(s):
if s[i] == ' ':
i += 1
continue
if s[i].isdigit():
j = i
while i+1 < len(s) and s[i+1].isdigit():
i += 1
stack_num.append(s[j:i+1])
elif s[i] == '(':
stack_opt.append(s[i])
elif s[i] == ')':
while stack_opt[-1] != '(':
a = stack_num.pop()
b = stack_num.pop()
opt = stack_opt.pop()
res = self.cal(b, a, opt)
stack_num.append(res)
stack_opt.pop()
else:
while stack_opt and priot[s[i]] <= priot[stack_opt[-1]]:
a = stack_num.pop()
b = stack_num.pop()
opt = stack_opt.pop()
res = self.cal(b, a, opt)
stack_num.append(res)
stack_opt.append(s[i])
i += 1
return int(stack_num[-1])