题解 | #牛牛计算器#
题目考察的知识点
-
栈的使用:代码中使用了
Stack(栈)来存储操作数。在JavaScript中,可以使用数组来模拟栈的功能。 -
表达式计算:题目要求对给定的算术表达式进行计算,需要理解表达式中的数字、操作符、括号等的含义,以及它们之间的计算顺序。
-
递归:当遇到左括号时,需要对括号内部的表达式进行递归计算。
题目解答方法的文字分析
-
定义一个栈(使用数组来模拟栈)来存储操作数。
-
初始化一个变量
num为0,用于保存当前的操作数。 -
遍历给定的字符串
s,并依次处理每个字符。 -
如果当前字符是数字,则将其转换为数字并更新
num。 -
如果当前字符是左括号,说明遇到了一个括号内的表达式,需要找到与之匹配的右括号,通过递归调用
calculate函数来计算括号内部的表达式结果。需要注意,递归调用时,传入的参数是从左括号的下一个字符开始到右括号之前的子串。 -
如果当前字符不是空格或者是表达式的最后一个字符,说明遇到了一个操作符或者到达了表达式的末尾。根据上一个操作符
preOp的值,将当前操作数num入栈。如果上一个操作符是减号,则将-num入栈,表示负数。 -
重置当前操作数
num为0,并更新上一个操作符preOp为当前字符。 -
遍历结束后,将栈中剩余的操作数相加得到最终结果。
本题解析所用的编程语言
本题解析所用的编程语言是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;
}
题解 | 前端刷题 文章被收录于专栏
题目考察的知识点 题目解答方法的文字分析 本题解析所用的编程语言 完整且正确的编程代码

查看16道真题和解析