JavaScript中栈和队列是基于数组等原生语法实现的LIFO和FIFO线性结构;栈用push/pop实现O(1)操作,队列优选索引偏移法避免shift的O(n)开销,二者广泛应用于DFS/BFS、事件循环等场景。

JavaScript 数据结构是指用 JavaScript 语言组织、存储和操作数据的方式,它不是语言内置的“类库”,而是基于原生语法(如数组、对象、函数)构建的逻辑模型。栈和队列是两种基础的线性数据结构,它们的核心区别在于数据进出的规则:栈是后进先出(LIFO),队列是先进先出(FIFO)。
栈常用 push() 和 pop() 操作模拟入栈和出栈,时间复杂度均为 O(1)。为保证封装性和语义清晰,建议封装成类或构造函数。
Stack 类,内部用数组存储元素push(item):向数组末尾添加元素pop():移除并返回数组末尾元素;若为空,可返回 undefined 或抛错peek()(查看栈顶)、isEmpty()(判断是否为空)、size()(返回长度)示例:
class Stack {
constructor() {
this.items = [];
}
push(item) {
this.items.push(item);
}
pop() {
return this.items.pop();
}
peek() {
return this.items[this.items.length - 1];
}
isEmpty() {
return this.items.length === 0;
}
size() {
return this.items.length;
}
}队列需支持从一端入、另一端出。若只用 push() 和 shift(),shift() 在数组头部删除会导致 O(n) 时间复杂度。更优做法是用双指针模拟(类似循环队列思想),或直接使用数组 + 索引管理避免频繁移动元素。
立即学习“Java免费学习笔记(深入)”;
push() 入队、shift() 出队,适合小规模或教学场景head 和 tail 索引,用数组存储,不实际删除元素,仅移动索引;当空间不足时可扩容或清理已出队部分enqueue(item)(入队)、dequeue()(出队)、front()(看队首)、isEmpty()、size()
简易版示例:
class Queue {
constructor() {
this.items = [];
}
enqueue(item) {
this.items.push(item);
}
dequeue() {
return this.items.shift();
}
front() {
return this.items[0];
}
isEmpty() {
return this.items.length === 0;
}
size() {
return this.items.length;
}
}避免 shift() 的性能损耗,可改用对象键值对 + 计数器,或用链表结构。但最简洁实用的方式是“索引偏移法”——用数组配合起始索引管理逻辑队首位置。
head = 0,items = []
enqueue 仍用 push;dequeue 不删元素,只返回 items[head] 并递增 head
head 超过一定比例(如一半),可截取剩余部分重置 items 和 head,保持内存合理size() 应为 items.length - head
理解它们不只是为了手写代码,更是为了识别问题模式:
Promise.then() 链、事件循环中的 microtask 队列,底层都体现队列思想以上就是javascript数据结构是什么_如何实现栈和队列的详细内容,更多请关注php中文网其它相关文章!
java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号