LeetCode上基本计算器,困难难度,记录下解题思路
传入一个字符串s,s是一个只包含加减和括号的运算式,要求计算这个运算式的结果
从左到右遍历整个字符串其实可以分为五种情况
- 当前元素是
+
- 当前元素是
-
- 当前元素是
(
- 当前元素是
)
- 当前元素是数字
需要针对不同的情况来进行操作
用一个标识符来表示当前数字前面的加减号,例如1-1
,可以理解为1 + -1
,那么加减情况就会转换为1*1 + -1*1
所以当元素元素是+
的时候标志位设为1
,如果元素是-
标志位设为-1
当遇到括号的时候例如1-(1+2)
的时候,从左到右遍历
第一位是1,直接加入res = 1
第二位是-
,此时sign = -1
第三位是(
,将之前的sign
放入栈,此时栈ops = [1,-1]
第四位是1,直接加入res = 1 + 1*-1
第五位是+
,获取ops = [1,-1]
的最后一位,此时sign = -1
第六位是1,此时sign = -1
,所以是res = 0 + 2*sign = -2
第七位)
,出栈此时栈ops = [1]
这样相当于把括号去掉了运算1-1-2
var calculate = function(s) {
let sign = 1
// 符号栈
let ops = [1]
// 当前的位置
let i = 0
// 返回的结果
let res = 0
// 1 + ( 1 + 1 ) + -2 + 1
while(i<s.length) {
if(s[i] === '+'){
// 加号情况
sign = ops[ops.length-1]
}else if(s[i] === '-'){
// 减号情况
sign = -ops[ops.length-1]
}else if(s[i] === '(') {
// 左括号情况
ops.push(sign)
}else if(s[i] === ')') {
// 右括号情况
ops.pop()
}else if(s[i] === ' ') {
// 空格情况
i++
continue
} else {
// 排除上面所有情况,是数字
let num = '';
// 这里排除被空格分开的数字的情况,;例如11写成了1 1
while (i < s.length && !(isNaN(Number(s[i])))) {
num+=s[i]
i++;
}
i--
// 计算当前的结果
res += sign * Number(num);
}
// 后移一位
i++
}
// 返回结果
return res
};