力扣刷题笔记:224.基本计算器(利用栈来处理括号的优先级,主要是逻辑思路要清晰,代码逐行注释,小表弟都看懂了)

题目:

224、基本计算器
实现一个基本的计算器来计算一个简单的字符串表达式 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 * 10^5
s 由数字、’+’、’-’、’(’、’)’、和 ’ ’ 组成
s 表示一个有效的表达式

题解思路:

重点:

本题目只有 “+”, “-” 运算,没有 “*” , “/” 运算,因此少了不同运算符优先级的比较;
遇到小括号,应该先算括号里面的表达式;

递归
一个表达式分为三部分:

左边表达式①,运算符③, 右边表达式②

本题中,左边和右边的表达式可以是一个数字,也可以是一个括号包起来的表达式;运算符可以是加减。

小学数学告诉我们,一个只包含加减和括号的表达式,我们可以从左到右计算,遇到括号就先算括号里面的。具体来说就是先计算左边的表达式,再计算右边表达式,最后根据运算符,计算 ①和②的运算 。

用题目示例 “(1+(4+5+2)-3)+(6+8)” 来说明运算符计算的顺序:
在这里插入图片描述
根据上面的分析可知,当我们在计算一个表达式的时候,需要先计算左边表达式①,然后需要把①的结果和运算符③保存起来,再需要计算右边表达式②,最后计算①和②的运算。这个操作就是递归!!


递归的程序可以用「栈」来模拟:栈为了保存左边表达式①的计算结果和运算符③,在计算右边表达式③的结果之后,从栈中取出运算符③和①的结果,再进行计算整个表达式的结果。

肯定有朋友想问了,用栈保存左边表达式结果的话,当遇到嵌套的括号怎么办?比如 (1 + (2 + (3 + 4)))。
答案是:栈顶保留的是最里层嵌套的运算,弹出栈的时候,正好先算的是最里面括号的,再算外边括号的。这种情况时,栈里面保存的是 [“1”, “+”, “2”, “+”, “3”, “+”],然后遇到 4,此时计算的是 3 + 4,然后算 7 + 2,再算 9 + 1。可以通过递归来帮助理解。

具体操作见代码注释。

题解python代码:

class Solution:
    def calculate(self, s: str) -> int:
        res, num, sign = 0, 0, 1
        stack = []
        for c in s:
            if c.isdigit():
                num = num*10+int(c)  # 应付部分两位数的数字
            elif c=="+" or c=="-":
                res += num*sign  # 遇到加减号就更新res和sign,然后重置num
                sign = 1 if c=="+" else -1
                num = 0
            elif c=="(":
                stack.append(res)  # 遇到左括号先保存临时结果
                stack.append(sign)   # 再保存符号,等右括号出现拿出
                res, sign = 0, 1   # 重置res、sign保存括号内的结果
            elif c==")":
                res += num*sign   # 利用num更新括号内res,然后重置num
                num = 0
                res *= stack.pop()   # 遇到右括号先取出sign更新括号内的res
                res += stack.pop()   # 再加上之前的栈内res
        res += num*sign   # 最后加上末尾的数字
        return res

在这里插入图片描述

作者:fuxuemingzhu
链接:https://leetcode-cn.com/problems/basic-calculator/solution/ru-he-xiang-dao-yong-zhan-si-lu-lai-zi-y-gpca/
来源:力扣(LeetCode)https://leetcode-cn.com/problems/basic-calculator/
————————————————————————————————————————————
作者:a-qing-ge
链接:https://leetcode-cn.com/problems/basic-calculator/solution/li-yong-zhan-lai-chu-li-gua-hao-you-xian-6hsa/
来源:力扣(LeetCode)https://leetcode-cn.com/problems/basic-calculator/

猜你喜欢

转载自blog.csdn.net/weixin_44414948/article/details/114629770