基本计算器
Tips
题目类型: Stack
题目
给你一个字符串表达式 s
, 请你实现一个基本计算器来计算并返回它的值.
注意:不允许使用任何将字符串作为数学表达式计算的内置函数, 比如 eval()
.
提示:
1 <= s.length <= 3 * 10⁵
s
由数字、'+'
、'-'
、'('
、')'
、和' '
组成s
表示一个有效的表达式'+'
不能用作一元运算(例如,"+1"
和"+(2 + 3)"
无效)'-'
可以用作一元运算(即"-1"
和"-(2 + 3)"
是有效的)- 输入中不存在两个连续的操作符
- 每个数字和运行的计算将适合于一个有符号的 32位整数
示例
输入: s = "1 + 1"
输出: 2
输入: s = " 2-1 + 2 "
输出: 3
输入: s = "(1+(4+5+2)-3)+(6+8)"
输出: 23
题解
/**
* @param {string} s
* @return {num}
*/
var calculate = function (s) {
const stack = []
let result = 0
let num = 0
let sign = 1
for (const ch of s) {
if (/[0-9]/.test(ch)) {
// 构建多位数字
num = num * 10 + Number(ch)
} else if (ch === '+' || ch === '-') {
// 计算之前的结果, 更新符号
result += sign * num
num = 0
sign = ch === '+' ? 1 : -1
} else if (ch === '(') {
// 保存当前状态, 进入新的计算环境
stack.push(result)
stack.push(sign)
result = 0
sign = 1
} else if (ch === ')') {
// 计算括号内的结果, 与之前的结果合并
result += sign * num
result *= stack.pop() // 弹出括号前的符号
result += stack.pop() // 弹出括号前的结果
num = 0
}
}
// 处理最后可能剩下的数字
if (num !== 0) {
result += sign * num
}
return result
}