zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    广度优先搜索(一)
    快速幂
    office 2013
    最著名的十大公式
    二分查找的上下界
    双关键字快速排序
    字符串操作
    分治算法练习(二)
    P3119 [USACO15JAN]草鉴定[SCC缩点+SPFA]
    P3225 [HNOI2012]矿场搭建[割点]
  • 原文地址:https://www.cnblogs.com/ISGuXing/p/14516643.html
Copyright © 2011-2022 走看看