当前位置:首页 > JavaScript

js用栈实现计算器

2026-04-05 02:19:14JavaScript

使用栈实现计算器的基本思路

利用栈结构可以实现带括号和运算符优先级的表达式计算。核心思想是通过两个栈(数字栈和运算符栈)处理运算符优先级和括号匹配。

关键步骤

初始化两个栈

js用栈实现计算器

  • 数字栈 numStack 用于存储操作数。
  • 运算符栈 opStack 用于存储运算符和括号。

定义运算符优先级

js用栈实现计算器

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

注意事项

  • 代码未处理除数为零或非法表达式的情况。
  • 如需支持浮点数,需修改数字读取逻辑和计算逻辑。
  • 运算符优先级可根据需求扩展(如 ^ 幂运算)。

标签: 计算器js
分享给朋友:

相关文章

js 实现倒计时

js 实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是两种常见实现方式。 使用 setInterval 实…

js分组实现

js分组实现

分组实现方法 在JavaScript中,可以通过多种方式实现数组或对象的分组操作。以下是几种常见的方法: 使用Array.prototype.reduce() 通过reduce方法可以轻松实现数组分…

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。 &…

js实现自举

js实现自举

实现 JavaScript 自举的方法 JavaScript 自举(Bootstrap)通常指通过 JavaScript 动态加载自身或依赖的脚本,实现运行时环境的初始化或扩展。以下是几种常见实现方式…

js实现投球

js实现投球

实现投球动画的基本思路 使用JavaScript和CSS动画结合的方式模拟投球效果。核心是通过改变元素的位置、旋转和缩放属性,配合定时器或CSS过渡实现平滑动画。 创建基础HTML结构 <…

js分页实现

js分页实现

分页的基本原理 分页的核心是通过计算当前页码和数据偏移量,从服务器或本地数据中截取对应范围的数据进行展示。通常需要以下参数:当前页码(currentPage)、每页条数(pageSize)、总数据量(…