给你一个字符串表达式 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 * 105s 由数字、'+'、'-'、'('、')'、和 ' ' 组成s 表示一个有效的表达式'+' 不能用作一元运算(例如, "+1" 和 "+(2 + 3)" 无效)'-' 可以用作一元运算(即 "-1" 和 "-(2 + 3)" 是有效的)输入中不存在两个连续的操作符每个数字和运行的计算将适合于一个有符号的 32位 整数
题解:
/**
* @param {string} s
* @return {number}
*/
var calculate = function (s) {
// 定义栈内初始值 且栈内数值均为1
const stack = [1];
// 定义变量 默认为1 => 正数 -1 => 负数
let sign = 1;
let ret = 0;
let i = 0
let n = s.length
while (i < n) {
// 当遇到空时跳出
if (s[i] === ' ') {
i++
continue
// 当遇到 + 时 sign 为正数1
} else if (s[i] == '+') {
sign = stack[stack.length - 1]
i++
// 当遇到 - 时 sign 为负数1
} else if (s[i] == '-') {
sign = -stack[stack.length - 1]
i++
} else if (s[i] == '(') {
stack.push(sign)
i++
} else if (s[i] == ')') {
stack.pop()
i++
} else {
let num = 0;
// 此处循环为了防止非单数
while (i < n && !(isNaN(Number(s[i]))) && s[i] !== ' ') {
num = num * 10 + s[i].charCodeAt() - '0'.charCodeAt();
i++
}
ret += sign * num;
}
}
return ret
};
来源:力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。