Python基础计算器II


假设我们需要实现一个基础计算器来计算简单的表达式字符串。表达式字符串仅包含非负整数,一些运算符如+,-,*,/和空格。整数除法只取商。

所以如果输入是“3+2*2”,则输出为7。

为了解决这个问题,我们将遵循以下步骤:

  • 定义一个栈s,i := 0,x := 空字符串
  • 对于字符串s中的每个字符j
    • 如果j不是空格字符
      • 将j添加到x中
  • s := x,n := x的长度
  • 当i < n
    • 如果s[i]是‘/’,则
      • i增加1
      • num := 从第i个索引开始的数字,然后将i更新为数字的最后一个字符
      • 如果栈顶元素< 0,则将栈顶元素更新为-(栈顶 / num),否则将栈顶元素更新为(栈顶 / num)
    • 否则,当s[i] = “*”
      • i增加1
      • num := 从第i个索引开始的数字,然后将i更新为数字的最后一个字符
      • 栈顶 := num * 栈顶
    • 否则,当s[i] = ‘-’
      • i增加1
      • num := 从第i个索引开始的数字,然后将i更新为数字的最后一个字符
      • 将–num插入栈中
    • 否则
      • num := 从第i个索引开始的数字,然后将i更新为数字的最后一个字符
      • 将num插入栈中
      • i增加1
  • 返回栈中元素的总和

让我们看下面的实现以更好地理解:

示例

class Solution(object):
   def calculate(self, s):
      """
      :type s: str
      :rtype: int
      """
      stack = []
      i = 0
      x=""
      for j in s:
      if j !=" ":
      x+=j
      s = x
      n = len(s)
      while i<n:
         if s[i] == '/':
            i+=1
         num,i = self.make_num(s,i)
         if stack[-1]<0:
            stack[-1] = -1*(abs(stack[-1])/num)
         else:
            stack[-1] = stack[-1]/num
      elif s[i] == '*':
         i+=1
         num,i = self.make_num(s,i)
         stack[-1] = stack[-1]*num
      elif s[i] == '-':
         i+=1
         num,i = self.make_num(s,i)
         stack.append(-num)
      elif s[i] =='+':
         i+=1
         num,i = self.make_num(s,i)
         stack.append(num)
      else:
         num,i = self.make_num(s,i)
         stack.append(num)
         i+=1
         return sum(stack)
   def make_num(self,s,i):
      start = i
      while i<len(s) and s[i]!= '/' and s[i]!= '*' and s[i]!= '-' and s[i]!='+':
      i+=1
   return int(s[start:i]),i-1

输入

"3+2*2"

输出

7

更新于:2020年3月4日

686 次浏览

启动您的职业生涯

完成课程获得认证

开始
广告