[路飞] 32——leetcode - [227] 基本计算器 II

332 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

227. 基本计算器 II

题目分析

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

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

你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。

注意: 不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。

思路讲解

我们在进行运算时,由于乘除法的优先级大于加减法,所以我们每次进行运算的时候,要根 据下一个运算符进行判断。所以我们需要在最前面手动添加一个运算符来辅助我们进行运 算。

我们可以创建一个栈,对于加减号后的数字,将其直接压入栈中;对于乘除号后的数字,可 以直接与栈顶元素计算,并替换栈顶元素为计算后的结果

示例

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

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

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

代码

/*
 * @lc app=leetcode.cn id=227 lang=javascript
 *
 * [227] 基本计算器 II
 */

// @lc code=start
/**
 * @param {string} s
 * @return {number}
 */
var calculate = function(s) {
  s = s.trim() // 去除字符串两端空格
  let stack = new Array() // 定义一个栈
  let preSign = '+' // 默认一个前置位是“+”
  let num = 0 // 默认最开始的数加0
  for (let i = 0; i < s.length; i++) {
    // 是数字并且不为空时
    if (!isNaN(s[i]) && s[i] !== ' ') {
      num = num * 10 + Number(s[i])
    }
    // 符号或者走到末尾时
    if (isNaN(s[i]) || i == s.length - 1) {
      switch (preSign) {
        case '+':
          stack.push(num)
          break;
        case '-':
          stack.push(-num)
            break;
        case '*':
          stack.push(stack.pop() * num)
              break;
        case '/':
          stack.push(stack.pop() / num | 0)
                break;
        default:
          break;
      }
      preSign = s[i]
      num = 0
    }
  }
  return stack.reduce((a, b) => a + b)
};