31-leetCode: 227. 基本计算器 II

125 阅读1分钟

题目

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

整数除法仅保留整数部分。

示例

输入: s = "3+2*2"
输出: 7

输入: s = " 3/2 "
输出: 1

输入: s = " 3+5 / 2 "
输出: 5

解题思路

本题的思路在于运用栈,将需要相加的数入栈,如果遇到 * / 则将最后一位出栈与当前值计算后再入栈, 最后将栈内的数字相加即可;这里需要注意的有两点:1、初始化sign为+, 因为第一个数要入栈;第二点是取数字应该取到遇到符号位置,可能是多位数字。

/**
 * @param {string} s
 * @return {number}
 */
var calculate = function(s) {
    // 先去除字符串空格
    s = s.replace(/\s/g, '');

    // 初始化符号,遍历起始,末尾值,数字栈
    let sign = '+', i = 0, n = s.length, stack = [];
    while(i<n) {
        let num = '';
        // 取符号前的所有数字
        while(!isNaN(s[i])) {
            num += s[i++];
        }
        switch(sign) {
            //  + - 号前的值入栈,注意 - 号入栈负数
            case '+':
                stack.push(+num);
                break;
            case '-':
                stack.push(-num);
                break;
            // * / 号 计算后入栈 
            case '*':
                stack.push(Math.trunc(stack.pop() * num));
                break;
            case '/':
                stack.push(Math.trunc(stack.pop() / num));
                break;
        }
        // 符号在每次循环的时候都要取下一位,这样遇到符号字符串时才是正确的符号
        sign = s[i++];
    }
    // 返回相加的结果
    return stack.reduce((a, b) => a + b)
};