[路飞]-leetcode 227题⭐基本计算器Ⅱ

822 阅读1分钟

我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战

基本计算器 II

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

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

解题思路: 栈
  1. 将数字存到栈中。 如果碰到 + -运算符 : +直接放到栈里,- 把数字的添加负号入栈, 如果碰到* /这两个运算符优先级比较高,需要将当前的数字与栈顶弹出的数字进行计算得到一个结果,再次放到栈中。
  2. 最后是将栈中的元素全部加起来就是计算器的结果啦。
/**
 * @param {string} s
 * @return {number}
 */
 var calculate = function(s) {
    // 首先得去掉两边的空格
    s = s.trim();
    var n = s.length; 
    var stack = []
    let preSig = '+'; // 初始化符号变量
    let num = 0
    for(let i = 0; i< n; ++i){
        let ch = s[i]
        // 如果是数字判断排除空格的情况
        if(!isNaN(Number(s[i])) && s[i] !== ' '){
            // 计算数字如果是不只一位的情况 如:23
            num = num * 10 + s[i].charCodeAt() - '0'.charCodeAt()
        }
        // 判断当字符是符号的情况, 最后是一位数字的情况i == n-1  
        if(isNaN(Number(s[i])) || i === n-1){
            switch(preSig){
                case '+':
                    // 加号数字直接入栈
                    stack.push(num)
                    break;
                case '-':
                    // 减号添加负号入栈
                    stack.push(-num)
                    break;
                case '*':
                    // 乘号这里要注意顺序 是将栈顶元素 和当前数字做运算
                    stack.push(stack.pop() * num )
                    break;
                default:
                    // 除法同乘法
                    stack.push(stack.pop() / num  | 0)  // | 二进制运算符 取或 防止计算出现小数
            }
            preSig = s[i];
            num = 0
        }
    }
    let ans = 0
    // 遍历栈中结果全部累加起来
    while(stack.length){
        ans += stack.pop()
    }
    return ans;
};

结束语

计算器乘除法是优先处理的,所以我们需要用到栈的思想,我们先要将数字放到栈中,在遇到/ *的时候将栈顶元素拿出来计算。最后计算加减。

如果您喜欢我的文章,可以[关注⭐]+[点赞👍]+[评论📃],您的三连是我前进的动力,期待与您共同成长~