登录
首页 >  文章 >  前端

栈与队列数据结构实现全解析

时间:2026-01-12 19:58:35 486浏览 收藏

珍惜时间,勤奋学习!今天给大家带来《JavaScript数据结构:栈与队列实现详解》,正文内容主要涉及到等等,如果你正在学习文章,或者是对文章有疑问,欢迎大家关注我!后面我会持续更新相关内容的,希望都能帮到正在学习的大家!

JavaScript中无内置栈和队列,可用数组模拟:栈用push/pop实现LIFO,队列用push/shift实现FIFO;高性能场景可用环形缓冲区优化,封装成类提升复用性。

javascript中的数据结构是什么_如何实现栈和队列?

JavaScript 中没有内置的栈(Stack)和队列(Queue)类型,但可以用数组(Array)或对象(Object)轻松模拟它们的行为。核心在于遵循对应的数据结构规则:栈是“后进先出”(LIFO),队列是“先进先出”(FIFO)。

用数组实现栈

数组的 push()pop() 方法天然支持 LIFO 操作,是最常用、最简洁的栈实现方式。

  • 入栈(push):用 arr.push(item) 在末尾添加元素
  • 出栈(pop):用 arr.pop() 移除并返回末尾元素
  • 查看栈顶(peek):访问 arr[arr.length - 1],不修改栈
  • 判空:检查 arr.length === 0

示例:

const stack = [];<br>stack.push(1); // [1]<br>stack.push(2); // [1, 2]<br>console.log(stack.pop()); // 2<br>console.log(stack[stack.length - 1]); // 1

用数组实现队列

数组也能模拟队列,但需注意性能:用 push() 入队没问题,但用 shift() 出队会在每次调用时移动所有后续元素,时间复杂度为 O(n)。适合小规模数据;大规模建议用链表或双端队列思路优化。

  • 入队(enqueue):用 arr.push(item)
  • 出队(dequeue):用 arr.shift()(移除并返回首项)
  • 查看队首(front):访问 arr[0]
  • 判空:同样检查 arr.length === 0

示例:

const queue = [];<br>queue.push('a'); // ['a']<br>queue.push('b'); // ['a', 'b']<br>console.log(queue.shift()); // 'a'<br>console.log(queue[0]); // 'b'

更高效的队列实现(环形缓冲区思路)

为避免 shift() 的性能问题,可手动维护头尾索引,复用数组空间。适用于对性能敏感或高频操作场景。

  • 用一个数组 + 两个指针:head(指向下一个要出队的位置)、tail(指向下一个要入队的位置)
  • 入队时写入 arr[tail],然后 tail++;出队时读取 arr[head],然后 head++
  • head === tail 时为空;当 (tail + 1) % capacity === head 时为满(需预留一个空位判断)

这种实现接近原生队列的 O(1) 均摊复杂度,但代码略长,日常开发中若非高频使用,数组 + push/shift 已足够清晰实用。

封装成类提升复用性

把逻辑封装成类,便于复用、测试和扩展。例如:

class Stack {<br>  constructor() { this.items = []; }<br>  push(item) { this.items.push(item); }<br>  pop() { return this.items.pop(); }<br>  peek() { return this.items[this.items.length - 1]; }<br>  isEmpty() { return this.items.length === 0; }<br>}<br><br>class Queue {<br>  constructor() { this.items = []; }<br>  enqueue(item) { this.items.push(item); }<br>  dequeue() { return this.items.shift(); }<br>  front() { return this.items[0]; }<br>  isEmpty() { return this.items.length === 0; }<br>}

这样在多个地方使用时语义清晰,也方便后期替换底层实现(比如换成链表)而不影响调用方。

本篇关于《栈与队列数据结构实现全解析》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于文章的相关知识,请关注golang学习网公众号!

前往漫画官网入口并下载 ➜
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>