掘金团队号上线,助你 Offer 临门! 点击 查看详情
题目描述
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
示例1:
输入:s = " 3/2 "
输出:1
解题思路
在进行运算时,由于乘除法的优先级大于加减法,所以每次进行运算的时候,要根据下一个运算符进行判断。所以需要在最前面手动添加一个运算符来辅助我们进行运算。
- 可以创建一个栈,对于加减号后的数字,将其直接压入栈中;
- 对于乘除号后的数字,可以直接与栈顶元素计算,并替换栈顶元素为计算后的结果。
- 具体来说,遍历字符串 s,并用变量preSign记录每个数字之前的运算符,对于第一个数字,其之前的运算符视为加号。
- 每次遍历到数字末尾时,根据preSign来决定计算方式
- 最后将栈中的所有数字进行累加就得到了我们需要的计算值
解题代码
var calculate = function (s) {
s = s.trim();
let stack = new Array();
let preSign = '+';
let n = s.length;
let num = 0;
for (let i = 0; i < n; i++) {
if (!isNaN(Number(s[i])) && s[i] !== ' ') {
num = num * 10 + Number(s[i]);
}
if (isNaN(Number(s[i])) || 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);
break;
}
preSign = s[i];
num = 0;
}
}
let ans = 0;
while (stack.length) {
ans += stack.pop();
}
return ans;
};
总结
千里执行,始于足下。