js用栈实现计算器
使用栈实现计算器的基本思路
利用栈结构可以实现带括号和运算符优先级的表达式计算。核心思想是通过两个栈(数字栈和运算符栈)处理运算符优先级和括号匹配。
关键步骤
初始化两个栈

- 数字栈
numStack用于存储操作数。 - 运算符栈
opStack用于存储运算符和括号。
定义运算符优先级

const priority = {
'+': 1,
'-': 1,
'*': 2,
'/': 2,
'(': 0,
')': 0
};
处理字符的函数
- 遇到数字时,读取完整数字并入数字栈。
- 遇到运算符时,比较当前运算符与栈顶运算符的优先级,决定是否先计算栈内运算。
- 遇到左括号直接入栈,遇到右括号则计算到左括号为止。
计算函数 从数字栈弹出两个数字,从运算符栈弹出一个运算符,计算后将结果压回数字栈:
function calculate(num1, num2, op) {
switch(op) {
case '+': return num1 + num2;
case '-': return num2 - num1;
case '*': return num1 * num2;
case '/': return num2 / num1;
}
}
完整代码实现
function calculateExpression(expression) {
const numStack = [];
const opStack = [];
const priority = { '+': 1, '-': 1, '*': 2, '/': 2, '(': 0, ')': 0 };
function compute() {
const num1 = numStack.pop();
const num2 = numStack.pop();
const op = opStack.pop();
numStack.push(calculate(num1, num2, op));
}
function calculate(num1, num2, op) {
switch(op) {
case '+': return num2 + num1;
case '-': return num2 - num1;
case '*': return num2 * num1;
case '/': return Math.floor(num2 / num1);
}
}
let i = 0;
while (i < expression.length) {
const c = expression[i];
if (c === ' ') {
i++;
continue;
}
if (!isNaN(c)) {
let num = 0;
while (i < expression.length && !isNaN(expression[i])) {
num = num * 10 + parseInt(expression[i]);
i++;
}
numStack.push(num);
} else if (c === '(') {
opStack.push(c);
i++;
} else if (c === ')') {
while (opStack[opStack.length - 1] !== '(') {
compute();
}
opStack.pop();
i++;
} else {
while (opStack.length > 0 && priority[opStack[opStack.length - 1]] >= priority[c]) {
compute();
}
opStack.push(c);
i++;
}
}
while (opStack.length > 0) {
compute();
}
return numStack.pop();
}
示例测试
console.log(calculateExpression("3 + 4 * 2")); // 输出 11
console.log(calculateExpression("(3 + 4) * 2")); // 输出 14
注意事项
- 代码未处理除数为零或非法表达式的情况。
- 如需支持浮点数,需修改数字读取逻辑和计算逻辑。
- 运算符优先级可根据需求扩展(如
^幂运算)。






