0224:基本计算器(★★)
目录
题目
给你一个字符串表达式 s
,请你实现一个基本计算器来计算并返回它的值。
注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval()
。
示例 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
表示一个有效的表达式- '+' 不能用作一元运算(例如, "+1" 和
"+(2 + 3)"
无效) - '-' 可以用作一元运算(即 "-1" 和
"-(2 + 3)"
是有效的) - 输入中不存在两个连续的操作符
- 每个数字和运行的计算将适合于一个有符号的 32位 整数
相似问题:
- 0150:逆波兰表达式求值
- 0227:基本计算器 II
- 0241:为运算表达式设计优先级
- 0282:给表达式添加运算符
- 0772:基本计算器 III
- 2019:解出数学表达式的学生分数(2583 分)
- 2232:向表达式添加括号后的最小结果(1611 分)
分析
四则运算有个通用的方法:
- 用一个栈 sk 维护数字,一个栈 ops 维护运算符
- 遍历到某个运算符时,将前面优先级更高的运算符从 ops 弹出,先运算
- 比如遇到 ‘+-’ 时,可以将 ops 栈顶的 ‘+-*/’ 先运算
- 遇到 ‘)’ 时,一直弹出 ops 的运算符,直到栈顶为 ‘(’ 为止
- 注意 s 末尾添加一个加号,让所有运算符都出栈
注意本题的’-‘可以用作一元运算,观察发现只有当 ‘-’ 在开头或在 ‘(’ 后面时才是一元运算,所以用 pre 保存上一个遍历元素,特判即可。
解答
|
|
122 ms