227. 基本计算器 II(JS实现)
227. 基本计算器 II(JS实现)
1 题目
实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式仅包含非负整数,+, – ,,/ 四种运算符和空格 。 整数除法仅保留整数部分。
示例 1:
输入: “3+22”
输出: 7
示例 2:
输入: ” 3/2 “
输出: 1
示例 3:
输入: ” 3+5 / 2 “
输出: 5
链接:https://leetcode-cn.com/problems/basic-calculator-ii
2 思路
这道题考察逆波兰算法,主要的思路就是先将中缀表达式转换为后缀表单式,然后再进行计算,在此过程中注意多位整数的情况
3代码
/**
* @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];
};