给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。
注意: 不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。
示例 1:
输入: s = "3+2*2"
输出: 7
示例 2:
输入: s = " 3/2 "
输出: 1
示例 3:
输入: s = " 3+5 / 2 "
输出: 5
题解:
/**
* @param {string} s
* @return {number}
*/
var calculate = function (s) {
const stack = [];
let curNum = 0, pre = "+";
// 遍历时最后一位进入stack栈内
s = s + "+"
for (let i = 0; i < s.length; i++) {
let ca = s[i]
// 如果为空跳过此次循环
if (ca == " ") continue;
// 当前值为 0 ~ 9时 做Number转换 curNum * 10 => 如果当前数不是单数的处理
if (ca >= "0" && ca <= "9") {
curNum = curNum * 10 + Number(ca)
} else {
// 遇到 + 时 直接入栈
// 遇到 - 时 当前数 负数入栈
// 遇到 * 时 栈顶出栈与当前数相乘入栈
// 遇到 / 时 栈顶出栈与当前数相除 | 0 取整数 入栈
switch (pre) {
case "+":
stack.push(curNum)
break
case "-":
stack.push(-curNum)
break
case "*":
stack.push(stack.pop() * curNum)
break
case "/":
stack.push((stack.pop() / curNum) | 0)
break
}
// 初始化curNum
curNum = 0
// 存储上一次值
pre = ca
}
}
let ans = 0;
// 循环栈内数据 累加
while (stack.length) {
ans += stack.pop();
}
return ans;
};
来源:力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。