[LeetCode] 224. Basic Calculator
Implement a basic calculator to evaluate a simple expression string.
The expression string may contain open ( and closing parentheses ), the plus + or minus sign -, non-negative integers and empty spaces .
Example 1:
Input: “1 + 1”
Output: 2
Example 2:
Input: “ 2-1 + 2 “
Output: 3
Example 3:
Input: “(1+(4+5+2)-3)+(6+8)”
Output: 23
Note:
You may assume that the given expression is always valid.
Do not use the eval built-in library function.
基本计算器。
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。 注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/basic-calculator 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
题意是实现一个基本的计算器来计算一个简单的字符串表达式的值。注意这个题是不需要处理乘法和除法的,只需要处理加减法
和带括号
的情形。
思路是用 stack。按字符逐个遍历 input,注意这道题无需处理不合法的输入,所以会轻松一些。一开始遍历的时候设置一个变量 res 和一个变量 sign 记录最后的结果
和结果的正负号
。注意这道题是会把运算符号以 +1
或 -1
的形式放入 stack 的,弹出的时候加减运算也是是会依赖运算符号的正负情况的。
最后着重讲一下带括号的部分,如果你遇到一个左括号,就需要把之前的 res 和 sign 加入 stack,这里顺序不能错,先加 res 再加 sign,并且把 res 和 sign 都重新设置成 0 和 1,使得他们可以继续用来记录括号内的部分的结果和正负情况。当遇到右括号的时候则开始结算括号内的结果。此时的 res 是记录了括号内的部分的结果,stack.pop() 会先弹出 sign;再弹一次的时候就得到了括号部分之前的 res,再相加就得到最终的结果了。
复杂度
时间O(n)
空间O(n)
代码
Java实现
1 |
|
相关题目
1 |
|