美文网首页LeetCode
227. 基本计算器 II

227. 基本计算器 II

作者: MarcQAQ | 来源:发表于2021-03-11 08:27 被阅读0次

    给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
    整数除法仅保留整数部分。
    输入:s = "3+22"
    输出:7
    提示:
    1 <= s.length <= 3 * 105
    s 由整数和算符 ('+', '-', '
    ', '/') 组成,中间由一些空格隔开
    s 表示一个 有效表达式
    表达式中的所有整数都是非负整数,且在范围 [0, 231 - 1] 内
    题目数据保证答案是一个 32-bit 整数

    难点在于加减和乘除运算具有不同的优先级。一个简单的解决办法是使用两个栈。首先只处理乘法和除法,第二次再处理加法和减法。时间和空间复杂度均为O(n)

    class Solution:
        '''
        227. Basic Calculator II
        Two stacks.
        '''
        def calculate(self, s: str) -> int:
            first_stack = list()
            idx = 0
            while idx < len(s):
                if s[idx] == ' ':
                    # ignore all the spaces
                    idx += 1
                    continue
                if s[idx] >= '0' and s[idx] <= '9':
                    # get the number if it has more
                    # than one digit
                    num_str = ''
                    while idx < len(s) and s[idx] >= '0' and s[idx] <= '9':
                        num_str += s[idx]
                        idx += 1
                    num = int(num_str)
                    if len(first_stack) == 0 or first_stack[-1] in ('+', '-'):
                        # if it's either + or - on top 
                        # of the stack, just push it
                        # into the stack
                        first_stack.append(num)
                    else:
                        # otherwise, evaluate and push the result
                        # back into the stack
                        operator = first_stack.pop()
                        left_operand = first_stack.pop()
                        first_stack.append(
                            left_operand * num if operator == '*' else left_operand // num
                        )
                    continue
                # for all the operators, just
                # push it into the stack
                first_stack.append(s[idx])
                idx += 1
    
            # have the scond stack to handle all
            # the plus and minus calculation
            second_stack = list()
            for each in first_stack:
                if type(each) == int:
                    if len(second_stack) == 0:
                        second_stack.append(each)
                    else:
                        operator = second_stack.pop()
                        left_operand = second_stack.pop()
                        second_stack.append(
                            left_operand + each if operator == '+' else left_operand - each
                        )
                else:
                    second_stack.append(each)
            
            return second_stack[0]
    

    相关文章

      网友评论

        本文标题:227. 基本计算器 II

        本文链接:https://www.haomeiwen.com/subject/sklnqltx.html