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)

 

posted @ 2021-03-11 11:12  ISGuXing  阅读(103)  评论(0编辑  收藏  举报