题目
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
示例
输入: s = "3+2*2"
输出: 7
输入: s = " 3/2 "
输出: 1
输入: s = " 3+5 / 2 "
输出: 5
解题思路
本题的思路在于运用栈,将需要相加的数入栈,如果遇到 * / 则将最后一位出栈与当前值计算后再入栈, 最后将栈内的数字相加即可;这里需要注意的有两点:1、初始化sign为+, 因为第一个数要入栈;第二点是取数字应该取到遇到符号位置,可能是多位数字。
/**
* @param {string} s
* @return {number}
*/
var calculate = function(s) {
// 先去除字符串空格
s = s.replace(/\s/g, '');
// 初始化符号,遍历起始,末尾值,数字栈
let sign = '+', i = 0, n = s.length, stack = [];
while(i<n) {
let num = '';
// 取符号前的所有数字
while(!isNaN(s[i])) {
num += s[i++];
}
switch(sign) {
// + - 号前的值入栈,注意 - 号入栈负数
case '+':
stack.push(+num);
break;
case '-':
stack.push(-num);
break;
// * / 号 计算后入栈
case '*':
stack.push(Math.trunc(stack.pop() * num));
break;
case '/':
stack.push(Math.trunc(stack.pop() / num));
break;
}
// 符号在每次循环的时候都要取下一位,这样遇到符号字符串时才是正确的符号
sign = s[i++];
}
// 返回相加的结果
return stack.reduce((a, b) => a + b)
};