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 @   ISGuXing  阅读(104)  评论(0编辑  收藏  举报
编辑推荐:
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
阅读排行:
· PPT革命!DeepSeek+Kimi=N小时工作5分钟完成?
· What?废柴, 还在本地部署DeepSeek吗?Are you kidding?
· DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地
· 程序员转型AI:行业分析
· 重磅发布!DeepSeek 微调秘籍揭秘,一键解锁升级版全家桶,AI 玩家必备神器!
点击右上角即可分享
微信分享提示