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];
};