当前位置:首页 > JavaScript

js 实现单链表实现栈

2026-03-15 13:09:37JavaScript

js 实现单链表实现栈

单链表实现栈的基本思路

使用单链表实现栈时,通常选择链表的头部作为栈顶。因为单链表的头部插入和删除操作的时间复杂度均为 O(1),符合栈的高效操作需求。栈的 push 对应链表头部插入节点,pop 对应链表头部删除节点。

js 实现单链表实现栈

代码实现

class ListNode {
  constructor(val, next = null) {
    this.val = val;
    this.next = next;
  }
}

class LinkedListStack {
  constructor() {
    this.head = null; // 栈顶指针
    this.size = 0;    // 栈大小
  }

  // 入栈操作
  push(val) {
    const newNode = new ListNode(val);
    newNode.next = this.head;
    this.head = newNode;
    this.size++;
  }

  // 出栈操作
  pop() {
    if (this.isEmpty()) {
      throw new Error("栈为空");
    }
    const val = this.head.val;
    this.head = this.head.next;
    this.size--;
    return val;
  }

  // 获取栈顶元素
  peek() {
    if (this.isEmpty()) {
      throw new Error("栈为空");
    }
    return this.head.val;
  }

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

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

使用示例

const stack = new LinkedListStack();
stack.push(1);
stack.push(2);
console.log(stack.peek()); // 输出 2
console.log(stack.pop());  // 输出 2
console.log(stack.getSize()); // 输出 1

关键点说明

  • 时间复杂度pushpoppeek 操作均为 O(1),因为只涉及链表头部的操作。
  • 空间复杂度:每个节点需要额外存储 next 指针,空间复杂度为 O(n)。
  • 边界处理:在 poppeek 时需检查栈是否为空,避免操作无效节点。

扩展优化

若需支持动态扩容或其他功能(如最小栈),可在单链表基础上扩展。例如,实现一个能获取栈中最小值的栈:

class MinStack {
  constructor() {
    this.stack = new LinkedListStack();
    this.minStack = new LinkedListStack(); // 辅助栈存储最小值
  }

  push(val) {
    this.stack.push(val);
    if (this.minStack.isEmpty() || val <= this.minStack.peek()) {
      this.minStack.push(val);
    }
  }

  pop() {
    const val = this.stack.pop();
    if (val === this.minStack.peek()) {
      this.minStack.pop();
    }
    return val;
  }

  getMin() {
    return this.minStack.peek();
  }
}

标签: 链表js
分享给朋友:

相关文章

js实现换肤

js实现换肤

使用CSS变量实现换肤 通过CSS变量可以轻松实现主题切换功能。CSS变量在根元素中定义,通过JavaScript动态修改这些变量值。 :root { --primary-color: #349…

js实现滚动

js实现滚动

实现滚动效果的方法 在JavaScript中实现滚动效果可以通过多种方式完成,以下是一些常见的方法: 使用window.scrollTo() window.scrollTo()方法可以将页面滚动到指…

js计算器的实现

js计算器的实现

实现基础结构 HTML部分需要创建计算器的基本框架,包含显示区域和按钮。使用<div>容器包裹整个计算器,内部设置一个显示屏和多个按钮。 <div class="calculato…

js实现图片移动

js实现图片移动

使用CSS和JavaScript实现图片移动 方法一:使用CSS动画结合JavaScript控制 通过CSS定义动画关键帧,JavaScript动态添加或移除动画类。 /* CSS部分 */ .m…

vue.js实现拍照

vue.js实现拍照

Vue.js 实现拍照功能 在 Vue.js 中实现拍照功能通常需要结合浏览器的媒体 API(如 getUserMedia)和 Canvas 元素。以下是实现步骤: 准备工作 确保项目已安装 Vue…

vue.js实现录音

vue.js实现录音

实现录音功能的基本步骤 在Vue.js中实现录音功能,通常需要结合浏览器的Web Audio API或第三方库。以下是几种常见的实现方式: 使用Web Audio API 浏览器原生提供的Media…