224. 基本计算器
难度困难441
实现一个基本的计算器来计算一个简单的字符串表达式 s
的值。
示例 1:
1 | 输入:s = "1 + 1" |
示例 2:
1 | 输入:s = " 2-1 + 2 " |
示例 3:
1 | 输入:s = "(1+(4+5+2)-3)+(6+8)" |
提示:
1 <= s.length <= 3 * 105
s
由数字、'+'
、'-'
、'('
、')'
、和' '
组成s
表示一个有效的表达式
递归代替栈
1 |
|
栈
我们需要维护一个栈 $\textit{ops}$,其中栈顶元素记录了当前位置所处的每个括号所「共同形成」的符号。例如,对于字符串 $\text{1+2+(3-(4+5))}$:
扫描到$ \text{1+2}$ 时,由于当前位置没有被任何括号所包含,则栈顶元素为初始值 $+1$;
扫描到 $\text{1+2+(3}$时,当前位置被一个括号所包含,该括号前面的符号为 ++ 号,因此栈顶元素依然 $+1$;
扫描到 $\text{1+2+(3-(4}$时,当前位置被两个括号所包含,分别对应着 + 号和 − 号,由于 + 号和 − 号合并的结果为 − 号,因此栈顶元素变为 $−1$。
在得到栈 $\textit{ops}$之后, $\textit{sign}$的取值就能够确定了:如果当前遇到了 + 号,则更新 $\textit{sign} \leftarrow \text{ops.top()}$;如果遇到了遇到了 − 号,则更新 $\textit{sign} \leftarrow -\text{ops.top()}$。
然后,每当遇到 (时,都要将当前的$ \textit{sign}$ 取值压入栈中;每当遇到 ) 时,都从栈中弹出一个元素。这样,我们能够在扫描字符串的时候,即时地更新 $\textit{ops}$ 中的元素。
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/basic-calculator/solution/ji-ben-ji-suan-qi-by-leetcode-solution-jvir/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
1 | class Solution { |