思路:首先把字符串用“*”和“/”分割开来,然后,对没有乘除号的调用正常的计算函数(这个函数LeetCode有实现方法,乘除号优先,用栈实现),然后再把现在只有乘除号的式子再调用一次正常的计算函数。
总体思路就是,基于乘除号优先的函数,我们每次优先调用只有加减号的表达子式。
例如:”1+2*3”的表达式,先后变成这样两个list,然后调用乘除号优先函数,得出结果。
[‘1+2’, ‘*’, ‘3’]
[3, ‘*’, ‘3’]
9
def calculate_ori( s):
if not s:
return "0"
stack, num, sign = [], 0, "+"
for i in range(len(s)):
if s[i].isdigit():
num = num*10+ord(s[i])-ord("0")
# print(num)
if (not s[i].isdigit() and not s[i].isspace()) or i == len(s)-1:
if sign == "-":
stack.append(-num)
# print(stack)
elif sign == "+":
stack.append(num)
# print(stack)
elif sign == "*":
stack.append(stack.pop()*num)
# print(stack)
else:
tmp = stack.pop()
stack.append(tmp//num)
sign = s[i]
num = 0
# print(sign)
return sum(stack)
mini = []
start = 0
def calculate( s,start):
if not s:
return "0"
for i in s:
if i =='*' or i =='/':
mini.append(s[start:s.index(i)])
mini.append(i)
start = s.index(i)+1
mini.append(s[start:])
# print(mini)
for i in mini:
if '-'in i or '+' in i:
mini[mini.index(i)]=calculate_ori(i)
# print(mini)
strr = ''.join([str(i) for i in mini])
return calculate_ori(strr)
print(calculate('1+2*3',0))