• 【leetcode】224. Basic Calculator


    题目如下:

    解题思路:我的解法是使用两个栈,一个保存运算符,一个保存括号和数字。因为只有加减操作,所以每个数字入栈前,先判断栈顶是否是'(',如果不是,则该数字和栈顶的数字进行运算后,把原来栈顶的数字删掉,把计算的结果入栈;否则,直接入栈。如果遇到')',计算栈中所有的数字,直到遇到'('。考虑到几种特殊的输入,我在代码中做了一些优化:

    1.输入只有一个数字,例如obj.calculate("1") -> 把输入字符串前后分别加上"("和")";

    2.第一个运算数字是负数,例如例如obj.calculate("-2+1")  -> 变成 ("0-2+1");

    代码如下:

    class Solution(object):
        #check if need to calculate before insert a new num to stack
        def calc(self,sk,op,num):
            if len(sk) != 0 and sk[-1] != '(' and sk[-1] != ')':
                if op[-1] == '+':
                    v3 = str(int(sk[-1]) + int(num))
                else:
                    v3 = str(int(sk[-1]) - int(num))
                del op[-1]
                del sk[-1]
                sk.append(v3)
            else:
                sk.append(num)
        def calculate(self, s):
            """
            :type s: str
            :rtype: int
            """
            s = '(' + s
            s += ')'
            operator = []
            stack = []
            numberstring  = '0123456789'
            number = ''
            for i in s:
                if i in numberstring:
                    number += i
                    continue
                else:
                    if len(number) > 0:
                        #####
                        if stack[-1] != '(' and stack[-1] != ')':
                            self.calc(stack,operator,number)
                        else:
                            stack.append(number)
                        number = ''
                if i == ' ':
                    continue
                elif i == '+' or i == '-':
                    operator.append(i)
                    if i == '-' and stack[-1] == '(':
                        stack.append('0') # if input is (-12+1),let it to (0-12+1)
                elif i == ')':
                    v1 = v2 = v3 = None
                    while stack[-1] != '(':
                        if v1 == None:
                            v1 = stack[-1]
                            v3 = v1  # if input is s.calculate("1")
                            del stack[-1]
                        elif v2 == None:
                            v2 = stack[-1]
                            del stack[-1]
                        if v1 != None and v2 != None:
                            if operator[-1] == '+':
                                v3 = str(int(v2) + int(v1))
                            else:
                                v3 = str(int(v2) - int(v1))
                            del operator[-1]
                            v1 = v3
                            v2 = None
                    del stack[-1]
                    self.calc(stack, operator, v3)
                elif i == '(':
                    stack.append(i)
            return int(stack[0])
  • 相关阅读:
    Vue
    自定义分页器
    selenium-确认进入了预期页面
    PyCharm常用快捷键(pycharm使用教程)
    Linux命令大全|linux常用命令
    ADB常用命令(adb常用命令)
    关于界面库
    VMWARE player 如何让 win2012 guest os 支持HYPER-V
    关于中文域名转码
    注册表中LEGACY残留项的清理技巧
  • 原文地址:https://www.cnblogs.com/seyjs/p/9268722.html
Copyright © 2020-2023  润新知