基本计算器 II
这道题没有括号,只有数字和加减,也就是说只需要关注乘除法的优先级即可,而优先级如何判断呢,可以通过栈的这种形式,只要存储好每个数字,当遇到了第二个字符的时候就将前面的那个数字入栈,需要纪录下前面的运算符,
class Solution:
def calculate(self, s: str) -> int:
stack = []
s += '$'
pre_flag = '+'
num = 0for c in s:
if c.isdigit():
num = num * 10 + int(c)
elif c == ' ': continue
else:
if pre_flag == '+':
stack.append(num)
elif pre_flag == '-':
stack.append(-num)
elif pre_flag == '*':
stack.append(stack.pop() * num)
elif pre_flag == '/':
stack.append(int(stack.pop() / num))
pre_flag = c
num = 0
return sum(stack)
基本计算器
这道题因为加入了括号的缘故,但是从这里开始没有了乘除,所以难度其实差不多,得加入符号的变化,其实也只需要存储括号前面的那个符号是什么,因为只有加减,所以其实并不难,只需要使用一个标志位sign纪录正负,另外一个栈stack用来存储进入括号之前的符号位和num就可以.
代码
class Solution:
def calculate(self, s: str) -> int:
#也就是说如果没有)的话就说明得将栈中的元素拿出来进行+-,遇到)就将元素都弹出来,然后
stack=[]
num,sign = 0,1 #sign必
ans=0 #answer
for c in s:
if c.isdigit(): #如果是一个数字的话,就需要将数字存储下面
num= num*10 + int(c) #
elif(c=='-' or c=='+'):
ans +=num*sign #这个不知道是什么符号
num=0 #也就是将
if(c=='-'):
sign=-1
else:
sign=1
elif(c=='('): #如果遇到了(
stack.append(ans)
stack.append(sign)
ans=0
sign=1
elif(c==')'):
ans +=sign*num
num=0 #也就是将这个变为 1
ans*=stack.pop() #看表达式外面的是什么符号,如果是符号就需要变反
ans+=stack.pop()
ans+=num*sign
return ans