给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
示例 1:
输入:s = "3+2*2" 输出:7 示例 2:
输入:s = " 3/2 " 输出:1 示例 3:
输入:s = " 3+5 / 2 " 输出:5
提示:
1 <= s.length <= 3 * 105 s 由整数和算符 ('+', '-', '*', '/') 组成,中间由一些空格隔开 s 表示一个 有效表达式 表达式中的所有整数都是非负整数,且在范围 [0, 231 - 1] 内
解题:
/**
* @param {string} s
* @return {number}
*/
var calculate = function(s) {
let stack = [];
let nums = [];
const map = {
'*': 1,
'/': 1,
'+': 0,
'-': 0
}
let prev;
for (let alpha of s) {
if (alpha === ' ') continue;
let transformNum = temp = parseInt(alpha);
if (!isNaN(prev) && !isNaN(transformNum)) { //处理多位整数
let prevNum = nums.pop();
transformNum = prevNum * 10 + transformNum;
}
prev = temp;
if (isNaN(transformNum)) {
while(stack.length > 0 && map[stack[stack.length - 1]] >= map[alpha]) { //如果是当前符号小于栈顶符号优先级,则栈顶符号依次出栈
nums.push(stack.pop());
}
stack.push(alpha);
} else { //如果是数字直接输出
nums.push(transformNum);
}
}
nums = nums.concat(stack.reverse());
stack = [];
for (let alpha of nums) {
let transformNum = parseInt(alpha);
if (isNaN(transformNum)) {
let num2 = stack.pop();
let num1 = stack.pop();
if (alpha === '+') {
stack.push(num1 + num2);
} else if (alpha === '-') {
stack.push(num1 - num2);
} else if (alpha === '*') {
stack.push(num1 * num2);
} else {
stack.push(parseInt(num1 / num2));
}
} else {
stack.push(transformNum);
}
}
return stack[0];
};