总结一下如何做计算器的这种题(python实现)

256 阅读1分钟

基本计算器 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