LeetCode227:基本计算器|| (栈、模拟)
解题思路:两个双端队列模拟,一个存放操作数 a,另一个存放操作符 op,如果找到另一个操作数b,判断操作队列队尾是否是*/,是的话执行 a(*or/)b。遍历完字符串,如果操作符队列非空,说明还有+-操作未执行,顺序遍历操作符队列。
1 class Solution:
2 def calculate(self, s):
3 stack = [] # 存储 a (op) b中的a
4 op = [] #存储操作
5 s= s+' '
6 val=0 # a (op) b中的b
7 flag= False
8 for i in range(len(s)-1):
9 if ord('0')<=ord(s[i])<=ord('9'):
10 val = val*10+ord(s[i])-ord('0')
11 flag = True
12 if not (ord('0')<=ord(s[i+1])<=ord('9')):
13 if len(op)>0:
14 if op[-1] == '*': #如果当前 b 识别结束,并且操作符栈有元素,判断是否是*/,是的话就执行*/操作
15 val = stack[-1]*val
16 _,_= stack.pop(),op.pop()
17 elif op[-1]=='/':
18 val = stack[-1]//val
19 _,_=stack.pop(),op.pop()
20 elif s[i] == '+' or s[i]=='-' or s[i]=='*' or s[i] == '/': #如果是操作符,把识别的a加入stack,s[i]加入操作栈
21 if flag:
22 stack.append(val)
23 val,flag = 0,0
24 op.append(s[i])
25
26 if flag: #如果flag为真,说明最后的b还没保存起来
27 stack.append(val)
28 ans =stack[0]
29 if len(op): #说明操作栈还有+-需要操作,按照从左到右顺序执行
30 for i in range(len(op)):
31 if op[i]=='+':
32 ans=ans+stack[i+1]
33 else:
34 ans = ans -stack[i+1]
35
36 return ans
37 s = Solution().calculate("2*2*3/3")
38 print(s)