当前位置:首页 > JavaScript

js实现堆栈

2026-03-15 06:44:24JavaScript

堆栈的基本概念

堆栈(Stack)是一种遵循后进先出(LIFO)原则的数据结构。主要操作包括:

js实现堆栈

  • push:将元素压入栈顶。
  • pop:移除并返回栈顶元素。
  • peek:返回栈顶元素但不移除。
  • isEmpty:检查栈是否为空。
  • size:返回栈中元素数量。

使用数组实现堆栈

数组是JavaScript中实现堆栈的简单方式,利用其原生方法如pushpop

js实现堆栈

class Stack {
  constructor() {
    this.items = [];
  }

  push(element) {
    this.items.push(element);
  }

  pop() {
    if (this.isEmpty()) {
      return "Stack is empty";
    }
    return this.items.pop();
  }

  peek() {
    if (this.isEmpty()) {
      return "Stack is empty";
    }
    return this.items[this.items.length - 1];
  }

  isEmpty() {
    return this.items.length === 0;
  }

  size() {
    return this.items.length;
  }

  clear() {
    this.items = [];
  }
}

// 使用示例
const stack = new Stack();
stack.push(10);
stack.push(20);
console.log(stack.pop()); // 输出 20
console.log(stack.peek()); // 输出 10

使用对象实现堆栈

对象实现可以避免数组的shiftsplice操作带来的性能问题,适合高频操作场景。

class Stack {
  constructor() {
    this.items = {};
    this.count = 0;
  }

  push(element) {
    this.items[this.count] = element;
    this.count++;
  }

  pop() {
    if (this.isEmpty()) {
      return "Stack is empty";
    }
    this.count--;
    const result = this.items[this.count];
    delete this.items[this.count];
    return result;
  }

  peek() {
    if (this.isEmpty()) {
      return "Stack is empty";
    }
    return this.items[this.count - 1];
  }

  isEmpty() {
    return this.count === 0;
  }

  size() {
    return this.count;
  }

  clear() {
    this.items = {};
    this.count = 0;
  }
}

// 使用示例
const stack = new Stack();
stack.push(30);
stack.push(40);
console.log(stack.pop()); // 输出 40
console.log(stack.peek()); // 输出 30

堆栈的应用场景

  • 函数调用栈:JavaScript引擎使用堆栈管理函数调用。
  • 撤销操作:如文本编辑器的撤销功能通过堆栈记录操作历史。
  • 括号匹配:检查表达式中的括号是否成对出现。
  • 进制转换:将十进制数转换为其他进制。

示例:括号匹配校验

利用堆栈检查字符串中的括号是否有效匹配。

function isBalanced(expr) {
  const stack = new Stack();
  const map = {
    '(': ')',
    '[': ']',
    '{': '}'
  };

  for (let char of expr) {
    if (map[char]) {
      stack.push(char);
    } else if (char === ')' || char === ']' || char === '}') {
      if (stack.isEmpty() || map[stack.pop()] !== char) {
        return false;
      }
    }
  }

  return stack.isEmpty();
}

console.log(isBalanced("({[]})")); // true
console.log(isBalanced("({[)]}")); // false

性能注意事项

  • 数组实现pushpop操作的时间复杂度为O(1),但数组动态扩容可能偶尔导致O(n)时间。
  • 对象实现:所有操作均为O(1),但代码稍复杂,适合对性能要求严格的场景。

标签: 堆栈js
分享给朋友:

相关文章

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div cl…

js 实现倒计时

js 实现倒计时

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

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…

js手势实现

js手势实现

手势识别实现方法 在JavaScript中实现手势识别通常涉及监听触摸事件(touchstart、touchmove、touchend)或鼠标事件(mousedown、mousemove、mouseu…

链表实现js

链表实现js

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