【路飞】javaScript 227. 基本计算器 II js实现

103 阅读1分钟

给你一个字符串表达式 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];
};