LeetCode224.基本计算器【困难】——2021.3.10

题目描述:
实现一个基本的计算器来计算一个简单的字符串表达式 s 的值。

示例 1:
输入:s = “1 + 1”
输出:2

示例 2:
输入:s = " 2-1 + 2 "
输出:3

示例 3:
输入:s = “(1+(4+5+2)-3)+(6+8)”
输出:23

提示:
1 <= s.length <= 3 * 105
s 由数字、’+’、’-’、’(’、’)’、和 ’ ’ 组成
s 表示一个有效的表达式

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/basic-calculator
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

通过代码:

class Solution:
    def calculate(self, s: str) -> int:
        s = s.replace(" ", "")
        #print(s)
        res = 0
        stack = []
        n = len(s)
        i = 0
        cur_num = ""
        sign = 1
        while i < n:
            # print(sign)
            if s[i] == '-':
                sign = -1
                i += 1
            elif s[i] == '+':
                sign = 1
                i += 1
            elif s[i] == '(':
                stack.append(res)
                stack.append(sign)
                #print(stack)
                res = 0
                sign = 1
                i += 1
            elif s[i] == ')':
                res = stack.pop(-1) * res + stack.pop(-1)
                i += 1
            else:
                while i < n and '0' <= s[i] <= '9':
                    #print(s[i])
                    cur_num += s[i]
                    i += 1
                res += ( sign * int(cur_num) )
                cur_num = ""
        return res

注意事项:

栈,每遇到 ‘(’ 将目前的 和res 与 符号sign(-1,1) 入栈,并将res置0、sign置1,当遇到 ‘)’ 时,说明一个括号内的和res计算完毕,将这个 和res 乘以栈中的 符号sign 并将之前的 和res 相加,循环内重复操作即可。(每计算一部分的和,就将结果和符号位压入栈,每遇到闭合括号,就做累加,保证最后是对的结果)

你可能感兴趣的:(LeetCode,栈,leetcode,算法,python)