计算器实现

class Solution:
    """
    @param s: the expression string
    @return: the answer
    """
    def calculate(self, s):
        # Write your code here
        order = {'+': 0, '-':0, '*': 1, '/':1}
        stack = []
        num = 0
        
        for c in s:
            if c.isdigit():
                num = num * 10 + int(c)
                
            if c in '+-*/':
                while stack and stack[-1] != '(' and order[stack[-1]] >= order[c]:
                    op = stack.pop()
                    pre = stack.pop()
                    num = self.calc(pre, num, op)
                stack.append(num)
                stack.append(c)
                num = 0
                
            if c is '(':
                stack.append(c)
                
            if c is ')':
                while stack[-1] != '(':
                    op = stack.pop()
                    pre = stack.pop()
                    num = self.calc(pre, num, op)
                stack.pop()
        
        while stack:
            op = stack.pop()
            pre = stack.pop()
            num = self.calc(pre, num, op)
            
        return num
        

    def calc(self, a, b, op):
        if op == '+':
            return a + b
        if op == '-':
            return a - b
        if op == '*':
            return a * b
        if op == '/':
            return a // b

class Solution:
    """
    @param s: the expression string
    @return: the answer
    """
    def __init__(self) :
        self.i = 0
    def parseExpr(self ,s) :
        nums = []
        op = '+'
        while self.i < len(s) and op != ')' :   #遇到右括号退出递归
            if s[self.i] == ' ' :
                self.i += 1
                continue
            if s[self.i] == '(' :    	#遇到左括号进入递归
                self.i += 1         
                n = self.parseExpr(s)
            else :							
                n = self.parseNum(s)	#字符串转化数字
            if  op == '+' :            #加法
                nums.append(n)		
            elif op == '-' :			#减法
                nums.append(-n)		
            elif op == '*' :			#乘法
                nums[-1] *= n			
            elif op == '/' :			#除法
                nums[-1] //= n	
            if self.i >= len(s) :
                break
            op = s[self.i]
            self.i += 1
        res = 0
        for n in nums :									
            res += n
        return res
    def parseNum(self, s) :
        n = 0
        while self.i < len(s) and s[self.i] >= '0' and s[self.i] <='9' :
            n = ord(s[self.i]) - ord('0') + 10 * n
            self.i += 1
        return n
    def calculate(self, s):
        # Write your code here
        return self.parseExpr(s)

全部评论

相关推荐

个人背景:学院二本计科专业&nbsp;大二开始实习个人经历:安克创新&nbsp;、理想汽车、字节跳动碎碎念:我做事只有三分钟热度。看到进了大厂的同学,我会羡慕,也会跟着努力上进;但遇到好看的小说,我又会放下手头的事沉迷其中,之前的坚持也就中断了。我有些自卑,总觉得自己学历和外貌都不够好。之前偶然在网上受到关注,我就喜欢上了上网,因为这里有很多人认可我。但我也很在意别人的评价,偶尔看到嘲讽的言论,会触发我的自卑情绪,让我感到愤怒。有时候我会强硬地回怼,有时候又会懦弱地选择无视。我也有虚荣心。不管是拿到安克、理想还是字节的机会,我在分享的时候都会带着这份心思。我会特意强调自己学历不好,是为了衬托出过程的艰难,以此显得自己更厉害。我知道,人往往会炫耀自己缺少的东西,来掩盖内心的空洞。我总想着走捷径,不太喜欢踏踏实实地做事。找实习的时候,我花了更多时间在研究面试技巧上,而不是提升专业能力。我会反复听面试录音分析技巧,看面试教程学习怎么和不同的面试官沟通,还会每天自言自语练习语言表达,同学都觉得我有点奇怪。我的实习生涯里,侥幸和运气占了很大一部分。我总在想,如果有一天我失去了这份幸运,这些特质可能会让我一蹶不振。ps:&nbsp;很多人会问我学习路线和经验&nbsp;但是就像我上面说的&nbsp;我的实习过程靠的很多是关键节点的运气&nbsp;技术上面我可能不如很多人&nbsp;&nbsp;所以请大家理性求助和理性参考我的回答&nbsp;附上我的投递记录
我的offer在哪里...:从去年看到现在,飞升哥就是榜样
我的求职进度条
点赞 评论 收藏
分享
03-17 23:54
黑龙江大学 Java
来个白菜也好啊qaq:可以的,大厂有的缺打手
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务