返回
代码铁匠铺 | 前端算法第二十三弹-227. 基本计算器 II
前端
2024-01-20 05:19:37
好的,以下是你要的:
前端算法第二十三弹-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实现一个基本计算器来计算字符串表达式的值。我们使用栈来存储数字和运算符,并使用栈顶的两个数字进行运算。我们继续这个过程,直到我们到达字符串的末尾。最后,栈顶的元素就是表达式的值。