当前位置:首页 > JavaScript

js实现堆栈

2026-02-02 06:56:28JavaScript

使用数组实现堆栈

堆栈是一种遵循后进先出(LIFO)原则的数据结构。在JavaScript中,可以通过数组的pushpop方法实现堆栈的基本操作。

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

使用链表实现堆栈

链表实现堆栈可以避免数组的动态扩容问题,适合对性能要求较高的场景。

class Node {
  constructor(value) {
    this.value = value;
    this.next = null;
  }
}

class LinkedListStack {
  constructor() {
    this.top = null;
    this.size = 0;
  }

  // 入栈
  push(value) {
    const newNode = new Node(value);
    newNode.next = this.top;
    this.top = newNode;
    this.size++;
  }

  // 出栈
  pop() {
    if (this.isEmpty()) {
      return "Stack is empty";
    }
    const value = this.top.value;
    this.top = this.top.next;
    this.size--;
    return value;
  }

  // 查看栈顶元素
  peek() {
    if (this.isEmpty()) {
      return "Stack is empty";
    }
    return this.top.value;
  }

  // 判断栈是否为空
  isEmpty() {
    return this.size === 0;
  }

  // 获取栈的大小
  getSize() {
    return this.size;
  }

  // 清空栈
  clear() {
    this.top = null;
    this.size = 0;
  }
}

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

堆栈的应用示例

堆栈常用于解决需要回溯的问题,例如括号匹配、函数调用栈等。

js实现堆栈

// 括号匹配检查
function isBalanced(expression) {
  const stack = new Stack();
  const brackets = { '(': ')', '[': ']', '{': '}' };

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

  return stack.isEmpty();
}

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

性能优化建议

对于高频操作的堆栈,使用链表实现可以避免数组的动态扩容开销。数组实现的堆栈在大多数情况下已经足够高效,但在极端情况下可能会触发数组的扩容操作。

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

相关文章

js实现图片上传

js实现图片上传

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现图片上传功能。HTML部分需要创建一个文件选择输入框和一个用于…

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…

js实现视口

js实现视口

js实现视口检测的方法 使用JavaScript检测元素是否进入视口(viewport)可以通过Intersection Observer API或手动计算元素位置实现。以下是两种常见方法: Int…

js怎么实现异步

js怎么实现异步

异步实现方法 JavaScript中实现异步操作主要通过以下几种方式: Promise Promise是ES6引入的异步解决方案,用于处理异步操作的成功或失败状态。 const promise =…

js实现路由

js实现路由

js实现路由的方法 在JavaScript中实现路由功能可以通过多种方式完成,以下是几种常见的方法: 使用原生JavaScript实现路由 通过监听window.onhashchange事件来实现基…

js进度条实现

js进度条实现

使用HTML和CSS创建基础结构 在HTML中创建一个容器元素用于显示进度条,通常使用<div>元素。CSS用于设置进度条的样式,包括宽度、高度、颜色和圆角等属性。 <div cl…