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绝对是大佬,这个题目的解释非常的清晰明了
总结:本以为栈挺简单的,发现越简单的数据结构在具体问题的应用上确实不太简单的。