【路飞】算法与数据结构-基本计算器 II 

248 阅读1分钟

LeetCode:地址

题目要求

给你一个字符串表达式 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] 内
题目数据保证答案是一个 32-bit 整数
思路

这道题跟计算器1的区别就是多了乘除 在遍历的时候匹配到乘除把数值栈的最后一位pop出来两数操作完再压回栈中 */优先计算 -相当于加上-num 所以把数值栈全部维护成一个加法栈 最后遍历一遍数值栈累加就行了

tip: 虽然题目给的要求是所有整数都是非负数,但是在操作的过程中有可能你的栈会有-num这样的数出现 所以在操作除法的时候Math.floor就适用不了 改为Matg.trunc 直接保留整数。

代码
/**
 * @param {string} s
 * @return {number}
 */
var calculate = function(s) {
  // 符号位
  let sign = '+'
  // 数值栈
  let arr = []
  // 累加和
  let ans = 0

  for(let i=0;i<s.length;i++){
    if(s[i] === ' '){
      // 过滤空格字符
    }else if(s[i] < '0'){
      // +-*/的ascii码都小于数字
      sign = s[i]
    }else {
      let str = ''
      while(i<s.length && s[i]>='0'){// 加减乘除和空格的都ascii都小于数字
        str+=s[i]
        i++
      }
      i-- // 上面的循环多了一次++ 在这里减掉
      str = Number(str) // 转Number 
      //---觉得有强迫症不喜欢这种非强类型的算法,上面的循环可以改成位运算
      if(sign === '+')arr.push(str)
      if(sign === '-')arr.push(str*-1)
      if(sign === '*')arr.push(arr.pop() * str)
      if(sign === '/')arr.push(Math.trunc(arr.pop() / str))
    }
  }
  for(let i=0;i<arr.length;i++){
    ans +=arr[i]
  }
  return ans
};