返回

代码铁匠铺 | 前端算法第二十三弹-227. 基本计算器 II

前端

好的,以下是你要的:

前端算法第二十三弹-227. 基本计算器 II

大家好,我是路飞。今天,我们将继续我们的前端算法系列,探讨如何使用JavaScript实现一个基本计算器来计算字符串表达式的值。

问题

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

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

示例 1:

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

示例 2:

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

示例 3:

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

解题思路

为了解决这个问题,我们可以使用栈来存储数字和运算符。当我们遇到一个数字时,我们将它推入栈中。当我们遇到一个运算符时,我们将它与栈顶的两个数字进行运算,并将结果推入栈中。我们继续这个过程,直到我们到达字符串的末尾。最后,栈顶的元素就是表达式的值。

代码实现

/**
 * 计算字符串表达式的值
 * @param {string} s
 * @return {number}
 */
const calculate = function (s) {
  // 去除字符串中的空格
  s = s.replace(/\s/g, "");

  // 创建栈
  const stack = [];

  // 当前数字
  let num = 0;

  // 上一个运算符
  let lastOperator = "+";

  // 遍历字符串
  for (let i = 0; i < s.length; i++) {
    const char = s[i];

    // 如果是数字
    if (!isNaN(parseInt(char))) {
      num = num * 10 + parseInt(char);
    }

    // 如果是运算符
    else if (char === "+" || char === "-" || char === "*" || char === "/") {
      // 如果当前数字不为0,将它推入栈中
      if (num !== 0) {
        stack.push(num);
      }

      // 将运算符推入栈中
      stack.push(char);

      // 重置当前数字
      num = 0;

      // 更新上一个运算符
      lastOperator = char;
    }
  }

  // 将最后一个数字推入栈中
  if (num !== 0) {
    stack.push(num);
  }

  // 计算栈中元素的值
  while (stack.length > 1) {
    const num1 = stack.pop();
    const operator = stack.pop();
    const num2 = stack.pop();

    let result;
    switch (operator) {
      case "+":
        result = num2 + num1;
        break;
      case "-":
        result = num2 - num1;
        break;
      case "*":
        result = num2 * num1;
        break;
      case "/":
        result = Math.floor(num2 / num1);
        break;
    }

    // 将结果推入栈中
    stack.push(result);
  }

  // 返回栈顶元素的值
  return stack[0];
};

总结

在本文中,我们介绍了如何使用JavaScript实现一个基本计算器来计算字符串表达式的值。我们使用栈来存储数字和运算符,并使用栈顶的两个数字进行运算。我们继续这个过程,直到我们到达字符串的末尾。最后,栈顶的元素就是表达式的值。