给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。
注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。
示例 1:
输入:s = "3+2*2"
输出:7
示例 2:
输入:s = " 3/2 "
输出:1
示例 3:
输入:s = " 3+5 / 2 "
输出:5因为字符中包含空格,首先正则替换去除所有空格
初始化符合为+号,初始化num为0,遍历字符串,当遇到符号的时候,按之前的符号决定目前的数字进行什么操作
+号将数字push进数组,-号则将数字变为负数push进数组
*号将数组的最后一位pop出来与当前数字相乘并push进数组,/号同理,不过是相除后取整
var calculate = function(s) {
s = s.replace(/\s/g, '')
let stack = [];
let num = 0;
let sign = '+';
for (let i = 0; i < s.length; i++) {
let ch = s[i];
if (ch <= '9' && ch >= '0') {
num = num * 10 + ch * 1;
}
if (ch < '0' || ch > '9' || i == s.length - 1) {
switch (sign) {
case '+': stack.push(num); break;
case '-': stack.push(-num); break;
case '*': stack.push(stack.pop() * num); break;
case '/': stack.push(Math.trunc(stack.pop() / num)); break;
}
sign = ch;
num = 0;
}
}
return stack.reduce((sum, cur) => {
return sum + cur;
}, 0)
};