• 【leetcode】Basic Calculator III


    题目如下:

    Implement a basic calculator to evaluate a simple expression string.
    
    The expression string may contain open ( and closing parentheses ), the plus + or minus sign -, non-negative integers and empty spaces .
    
    The expression string contains only non-negative integers, +, -, *, / operators , open ( and closing parentheses ) and empty spaces . The integer division should truncate toward zero.
    
    You may assume that the given expression is always valid. All intermediate results will be in the range of [-2147483648, 2147483647].
    
    Some examples:
    
    "1 + 1" = 2
    " 6-4 / 2 " = 4
    "2*(5+5*2)/3+(6/2+8)" = 21
    "(2+6* 3+5- (3*14/7+2)*5)+3"=-12
     
    
    Note: Do not use the eval built-in library function.

    解题思路:算法上没有什么技术难度,无非就是要考虑各种情况。我的方法是用两个栈分别保存运算符号和非运算符号(包括数字和括号)。遇到右括号后,往前找左括号,遇到乘号或者除号,直接计算出结果。

    代码如下:(写的很乱,也没心情优化了)

    class Solution(object):
        operator = []
        num = []
        def calcMandD(self,v):
            if len(self.operator) == 0 or len(self.num) == 0:
                return False 
            if (self.operator[-1] == '*' or self.operator[-1] == '/') and (self.num[-1] != '(' and self.num[-1] != ')'):
                if self.operator[-1] == '*' :
                    tmp = int(self.num[-1]) * int(v)
                    self.num[-1] = str(tmp)
                else:
                    tmp = int(self.num[-1]) / int(v)
                    self.num[-1] = str(tmp)
                del self.operator[-1]
                return True
            return False
        def calcParentheses(self):
            t1 = self.num[-1]
            del self.num[-1]
            
            tn = []
            to = []
            
            tn.append(t1)
            
            while self.num[-1] != '(':
                t2 = self.num[-1]
                
                to.insert(0, self.operator[-1])
                tn.insert(0, t2)
                del self.operator[-1]
                del self.num[-1]
            del self.num[-1] #del (
            
            
            t1 = tn[0]
            del tn[0]
            while len(tn) > 0:
                t2 = tn[0]
                if to[0] == '+':
                    t1 = int(t1) + int(t2)
                elif to[0] == '-':
                    t1 = int(t1) - int(t2)
                del to[0]
                del tn[0]        
            return str(t1)
            #self.num.append(str(t1))
        def calcAandM(self):
            t1 = self.num[0]
            del self.num[0]
            while len(self.num) > 0:
                t2 = self.num[0]
                if self.operator[0] == '+':
                    t1 = int(t1) + int(t2)
                elif self.operator[0] == '-':
                    t1 = int(t1) - int(t2)
                del self.operator[0]
                del self.num[0]
            return int(t1)        
            
        def calculate2(self, s): 
            n = ''
            for i in s:
                if i == ' ':
                    continue
                if i == '+' or i == '-' or i == '*' or i == '/':
                    if n != '':
                        if self.calcMandD(n) == False:
                            self.num.append(n)
                    n = ''
                    self.operator.append(i)
                    continue
                if i == '(':
                    if n != '':
                        self.num.append(n)
                    n = ''
                    self.num.append(i)
                    continue
                if i == ')':
                    if n != '':
                        if self.calcMandD(n) == False:
                            self.num.append(n)
                    n = ''
                    ret = self.calcParentheses()
                    while len(self.operator) >0 and (self.operator[-1] == '*' or self.operator[-1] == '/') and (self.num[-1] != '(' and self.num[-1] != ')'):
                        if self.operator[-1] == '*':
                            #print self.num
                            #print self.operator
                            ret = int(self.num[-1]) * int(ret)
                        else:
                            ret = int(self.num[-1])/int(ret)
                        del self.operator[-1] 
                        del self.num[-1]
                    self.num.append(ret)
                        
                    
                    continue
                if i>='0' and i <= '9':
                    n += i
            if n!='':
                if self.calcMandD(n) == False:
                    self.num.append(n)
                      
        def calculate(self, s):
            """
            :type s: str
            :rtype: int
            """
            self.operator = []
            self.num = []
            self.calculate2(s)
            #print (self.operator)
            #print (self.num)
            return self.calcAandM()
  • 相关阅读:
    vue多项目的工程化部署
    vue+element项目部署到线上,icon图标不显示
    elementui的表格嵌套表单及校验demo
    借鉴微信小程序表单校验wxValidate的源码里边的正则
    vue中el-upload上传多图片且携带参数,批量而不是一张一张的解决方案
    Maven笔记
    《图解HTTP》摘要
    Java面向对象
    MySQL数据库学习记录
    Python二维数组操作
  • 原文地址:https://www.cnblogs.com/seyjs/p/8351112.html
Copyright © 2020-2023  润新知