[路飞]_LeetCode227.基本计算器||

213 阅读1分钟

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

LeetCode227.基本计算器||

题目要求

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

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

示例 1:

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

示例 2:

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

思路

我们可以先取出数字部分保存在一个变量里面,再判断符号部分

  • 如果是 + 就把上一次找到的数字放进一个数组里面

  • 如果是 - 就把上一次找到的数字前面添加一个 - 然后放进数组里面

  • 如果是 * 就把数组最后面的一个数字 * 上一次找到的数字得到一个结果然后放进数组里面

  • 如果是 / 就把数组最后面的一个数字 / 上一次找到的数字最后返回一个整数

再保证数组的长度大于0的情况下对数组里面的值做求和操作

var calculate = function(s) {    
    s = s.trim();    
    let stack = [];    
    let len = s.length;    
    let sign = '+';    
    let num = 0;    
    for (let i=0; i<len; i++) {        
        // 找出所有的数字        
        if (!isNaN(Number(s[i])) && s[i] !== ' ') {            
            num = num * 10 + s[i].charCodeAt() - '0'.charCodeAt();        
        }        
        // 找出里面的所有符号        
        if (isNaN(Number(s[i])) || i === len-1) {            
            switch (sign) {                
                case '+':                    
                    stack.push(num);                    
                    break;                
                case '-':                    
                    stack.push(-num); // -num = + (-num)                    
                    break;                
                case '*':                    
                    stack.push(stack.pop() * num)                    
                    break;                
                default:                    
                    stack.push(parseInt(stack.pop() / num)); //注意取整数                    
                    break;            
                }            
                sign = s[i]; // 替换sign 的值            
                num = 0;        
            }    
        }    
        let ans = 0;    
        while (stack.length) {        
            ans += stack.pop();    
        }    
        return ans;
};