当前位置:首页 > JavaScript

js栈实现

2026-02-01 07:30:45JavaScript

栈的基本概念

栈是一种遵循后进先出(LIFO)原则的数据结构,仅允许在栈顶进行插入(压栈)和删除(弹栈)操作。JavaScript中可通过数组或链表实现栈。

基于数组的栈实现

利用数组的push()pop()方法可高效模拟栈操作:

js栈实现

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

  // 压栈
  push(element) {
    this.items.push(element);
  }

  // 弹栈
  pop() {
    if (this.isEmpty()) return "Underflow";
    return this.items.pop();
  }

  // 查看栈顶元素
  peek() {
    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

基于链表的栈实现

通过链表节点实现栈,避免数组的固定大小限制:

js栈实现

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

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

  push(value) {
    const newNode = new Node(value);
    newNode.next = this.top;
    this.top = newNode;
    this.length++;
  }

  pop() {
    if (this.isEmpty()) return null;
    const poppedValue = this.top.value;
    this.top = this.top.next;
    this.length--;
    return poppedValue;
  }

  peek() {
    return this.top?.value;
  }

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

性能对比

  • 数组栈:操作时间复杂度为O(1),但可能触发动态扩容。
  • 链表栈:无需扩容,但每个操作需处理指针,常数时间略高。

应用场景

  1. 函数调用栈:记录函数执行上下文。
  2. 括号匹配:检查表达式中的括号是否成对。
  3. 撤销操作:保存操作历史以便回退。

括号匹配示例

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

  for (const char of expr) {
    if (map[char]) stack.push(char);
    else if (char !== map[stack.pop()]) return false;
  }
  return stack.isEmpty();
}
console.log(isBalanced("{[()]}")); // true

注意事项

  • 数组实现需注意边界条件(如空栈弹栈)。
  • 链表实现需正确处理next指针,避免内存泄漏。
  • 根据场景选择实现方式,高频操作推荐数组栈。

标签: js
分享给朋友:

相关文章

js实现拷贝

js实现拷贝

实现文本拷贝 使用 document.execCommand 方法(已废弃但兼容性较好): function copyText(text) { const textarea = document…

js实现延迟

js实现延迟

实现延迟的方法 在JavaScript中,实现延迟操作有多种方式,以下是几种常见的方法: 使用setTimeout函数 setTimeout是JavaScript中最常用的延迟执行方法。它接受一个回…

js实现驼峰

js实现驼峰

实现驼峰命名的几种方法 使用正则表达式和字符串替换 通过正则表达式匹配字符串中的特定模式(如下划线或短横线),并将其后的字母转换为大写,同时移除分隔符。 function toCamelCase(s…

js实现游标

js实现游标

使用JavaScript实现游标 在JavaScript中,可以通过操作DOM元素的cursor样式属性来实现自定义游标效果。以下是几种常见的实现方法: 修改默认鼠标指针样式 通过CSS的curso…

js实现自举

js实现自举

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

js实现视口

js实现视口

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