March——224.基本计算器I,II

class Solution:
    def calculate(self, s: str) -> int:
         # 初始化sign为 “+”,是因为开头是数字
        num ,stack ,sign = 0 , [] , '+'
        for i in range(len(s)):
            ch = s[i]
            if ch.isdigit():
                num = num * 10 + int(ch)
            #根据当前数字之前的符号,来决定如何处理当前数值
            # 并将处理后的数值压入栈中
            if ch in "+-*/" or i == len(s)-1:
                if sign == "+" :
                    stack.append(num)
                elif sign == "-" :
                    stack.append(-num)
                elif sign == "*":
                    stack.append(stack.pop() * num)
                else:
                    stack.append(int(stack.pop()/num))
                num = 0
                sign = ch
        return sum(stack)
  •  题目分析
    • 从小学的知识我们就可以了解到,基本运算的时候先乘除,再加减,如果有括号那么先计算括号内的
    • 针对这个题目来说,还没有括号,所有我们先计算乘除,再计算加减
    • 基本上这个题是需要用栈的数据结构来解决这个问题的,初始化一个栈,在初始化一个符号,最初的符号都是加号
      • 如果是数字,那先计算该字符串转为整数
      • 如果当前字符串是字符的话,那么如果是加减,给num乘上它的系数,然后入栈;如果是乘除,那么先出栈和当前的元素进行运算,然后在入栈
      • 然后更新当前num为0,并且记录当前的系数
  • Summarize
    • 考点之一,在于如何把一个字符串转换成一个十进制的整数
    • 考点之二,遇到’+-*/‘的时候应该怎么处理
    • 考点之三,每次运算完之后如何更新当前的系数和下一次的整数

class Solution:
    def calculate(self, s: str) -> int:
        sDeque = deque(s)
        def helper(sDeque):
            num = 0
            sign = "+"
            stack = []
            while len(sDeque) > 0:
                # 注意 这里需要从头部开始pop
                char = sDeque.popleft()
                if char.isdigit():
                    num = num * 10 + int(char)
                if char == '(':
                    #遇到左括号,开始递归调用
                    num = helper(sDeque)                
                if (not char.isdigit() and char != " ") or len(sDeque) == 0:
                    if sign == "+":
                        stack.append(num)
                    elif sign == "-":
                        stack.append(-num)
                    elif sign =='*':
                        stack.append(stack.pop()*num)
                    elif sign == '/':
                        stack.append(stack.pop()/num)
                    # 重置num和sign
                    num = 0
                    sign = char
                if char == ")":
                    #遇到右括号直接结束当前的递归
                    break
            return sum(stack)
        return helper(sDeque)
  • 题目分析
    • 是上一道题目的升级版,加了括号了。
    • 先将之前的字符串转换为一个双端队列
    • 其他不变,如果我们遇到左括号,那么需要递归进行计算,如果遇到右括号结束本次递归调用,跳出while循环即可

这里面贴一个如何拆解复杂问题:实现一个计算器,labuladong绝对是大佬,这个题目的解释非常的清晰明了

总结:本以为栈挺简单的,发现越简单的数据结构在具体问题的应用上确实不太简单的。

猜你喜欢

转载自blog.csdn.net/weixin_37724529/article/details/114680228