题解 | #牛牛计算器#

题目考察的知识点

  1. 栈的使用:代码中使用了Stack(栈)来存储操作数。在JavaScript中,可以使用数组来模拟栈的功能。

  2. 表达式计算:题目要求对给定的算术表达式进行计算,需要理解表达式中的数字、操作符、括号等的含义,以及它们之间的计算顺序。

  3. 递归:当遇到左括号时,需要对括号内部的表达式进行递归计算。

题目解答方法的文字分析

  1. 定义一个栈(使用数组来模拟栈)来存储操作数。

  2. 初始化一个变量num为0,用于保存当前的操作数。

  3. 遍历给定的字符串s,并依次处理每个字符。

  4. 如果当前字符是数字,则将其转换为数字并更新num

  5. 如果当前字符是左括号,说明遇到了一个括号内的表达式,需要找到与之匹配的右括号,通过递归调用calculate函数来计算括号内部的表达式结果。需要注意,递归调用时,传入的参数是从左括号的下一个字符开始到右括号之前的子串。

  6. 如果当前字符不是空格或者是表达式的最后一个字符,说明遇到了一个操作符或者到达了表达式的末尾。根据上一个操作符preOp的值,将当前操作数num入栈。如果上一个操作符是减号,则将-num入栈,表示负数。

  7. 重置当前操作数num为0,并更新上一个操作符preOp为当前字符。

  8. 遍历结束后,将栈中剩余的操作数相加得到最终结果。

本题解析所用的编程语言

本题解析所用的编程语言是JavaScript。

完整且正确的编程代码

function calculate(s) {
  let nums = [];  // 存储操作数的栈

  let num = 0;
  let preOp = '+';
  for (let i = 0; i < s.length; ++i) {
    let c = s.charAt(i);
    // 如果当前字符是数字
    if (/\d/.test(c)) {
      num = num * 10 + parseInt(c); // 将字符转换为数字
    } else if (c === '(') { // 如果是左括号
      let j = i, cnt = 0;
      for (; i < s.length; ++i) {
        // 统计括号
        if (s.charAt(i) === '(') cnt++;
        if (s.charAt(i) === ')') cnt--;
        if (cnt === 0) {
          break; // 当左括号和右括号个数相等时,认为匹配完成
        }
      }
      num = calculate(s.substring(j + 1, i)); // 递归计算括号内部表达式的结果
    }
    // 如果当前字符不是空格或者是表达式的最后一个字符
    if (!/\s/.test(c) || i === s.length - 1) {
      if (preOp === '+') {
        nums.push(num);
      } else if (preOp === '-') {
        nums.push(-num);  // -号,则入栈相反数
      } else if (preOp === '*') {
        let temp = nums.pop() * num;
        nums.push(temp);  // 将计算结果入栈
      }
      num = 0;  // 重置当前操作数
      preOp = c;  // 更新前一个操作符
    }
  }
  let res = 0;
  while (nums.length > 0) {
    res += nums.pop();  // 将栈中剩余的操作数相加得到最终结果
  }
  return res;
}
题解 | 前端刷题 文章被收录于专栏

题目考察的知识点 题目解答方法的文字分析 本题解析所用的编程语言 完整且正确的编程代码

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务