「这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战」
题目:基本计算器 II
分析
处理加减法
- 以3+2-1为例,先给第一个数字加一个默认符号+,变成+3+2-1;
- 把第一个运算符和数字组合成一对,也就是三对+3,+2,-1,把它们转成数字,然后放到一个栈中;
处理乘除法
- 乘除法可以和栈顶的数相结合,然后加入栈;而加减法只能把自己放入栈;
注意
- 不止是遇到新的符号会触发入栈,当i走到了算式的尽头(i == s.length - 1),也应该将前面的数字入栈,方便后序计算最终结果。
- 为了保证最后得到的是一个数字(i == s.length - 1),s最开始要去除前后空格,s = s.trim();
function calculate(s) {
s = s.trim();
const stack = [];
// 第一个数字加一个默认符号
let preSign = '+';
let num = 0;
const n = s.length;
for (let i = 0; i < n; ++i) {
const val = s[i]
// 如果是数字,则累加
if (s[i] >= '0') {
// 处理连续的数字,比如46;
num = num * 10 + parseInt(s[i]);
}
// 如果是符号,则计算之前的数字
if (val == '+' || val == '-' || val == '/' || val == '*' || i === n - 1) {
switch (preSign) {
case '+':
stack.push(num);
break;
case '-':
stack.push(-num);
break;
case '*':
stack.push(stack.pop() * num);
break;
default:
stack.push(stack.pop() / num | 0);
}
preSign = s[i];
num = 0;
}
}
let ans = 0;
while (stack.length) {
ans += stack.pop();
}
return ans;
};