当前位置:首页 > 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实现图片预览

使用FileReader API实现图片预览 通过FileReader对象读取用户选择的图片文件并显示预览: const input = document.getElementById('image…

js实现列表

js实现列表

使用 JavaScript 实现列表 JavaScript 提供了多种方式来实现列表功能,包括数组操作、DOM 元素动态生成等。以下是几种常见的实现方法: 使用数组存储列表数据 数组是 JavaSc…

js实现自举

js实现自举

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

链表实现js

链表实现js

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针(单向链表)或两个指针(双向链表)。与数组不同,链表在内存中非连续存储,插入和删除操作更高效,但随机…

js实现交换

js实现交换

交换变量的方法 在JavaScript中,交换两个变量的值有多种方法。以下是常见的几种实现方式: 使用临时变量 通过引入一个临时变量来存储其中一个变量的值,实现交换: let a = 1; le…

vue实现js休眠

vue实现js休眠

实现 JavaScript 休眠的方法 在 Vue 中实现 JavaScript 休眠(延迟执行)可以通过以下方式实现。由于 JavaScript 本身没有内置的 sleep 函数,通常使用 Prom…