【路飞】算法-基本计算器II

670 阅读1分钟

题目链接 LeetCode: leetcode-cn.com/problems/ba… 题目简介 给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

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

示例

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

实现思路 1、由于乘除法的优先级高于加减法,所以先进行乘除运算,并将运算后的整数放回原表达式的相应位置,然后进行一系列的加减法即可
2、实现中,可以考虑使用栈的数据结构。保存所有最后要进行加减运算的整数。对于是加减法的整数直接压入栈中,对于是乘除法的数字可以先和栈顶元素运算再压入栈中。 代码实现

/**
 * @param {string} s
 * @return {number}
 */
 var calculate = function(s) {
     s = s.trim(); // 去掉字符串两边的空格
     const stack = [];
     let preSign = '+'; // 记录符号,默认第一个数字前是个+,对数字没有任何影响
     let num = 0; // 记录当前数字
     const n = s.length;
     for(let i=0;i<n;++i){
         // 找出所有数字
         if(!isNaN(Number(s[i])) && s[i] !== ' '){
             num = num * 10 + s[i].charCodeAt() - '0'.charCodeAt();
         }
             // 找出所有符号
         if(isNaN(Number(s[i])) || i === n-1){
             switch(preSign){
                 case '+':
                     stack.push(num); // 如果是+直接向栈中添加
                     break;
                 case '-':
                     stack.push(-num); // 如果是-,向栈中添加-num,相加时相当于做减法
                     break;
                 case '*':
                     stack.push(stack.pop() * num); // 如果是*,向栈中添加当前数字和栈顶元素相乘的结果,因为乘除法优先级更高
                     break;
                 default:
                     stack.push(parseInt(stack.pop() / num)); // 是 / ,则向栈中添加栈顶元素 / 当前数字并只取整数的结果
                     break;
             }
         preSign = s[i]; // 替换preSign 的值
         num = 0;
         }
     }
 let ans = 0; // 记录计算后的结果
 while(stack.length){
         // 将所有栈顶元素相加
     ans += stack.pop();
 }
 return ans;
 }