队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表。
在具体应用中通常用链表或者数组来实现。
队列只允许在后端(称为rear)进行插入操作,
在前端(称为front)进行删除操作。
队列的操作方式和堆栈类似,
唯一的区别在于队列只允许新数据在后端进行添加。
解释
以上是 维基百科 关于队列的描述,转换为人话就是大概这么几条:
-
先入先出
的数据结构 -
两个指针进行操作数据
-
入队
指针 -
出队
指针
-
-
两个异常
-
Queue Overflow
队列溢出- 队列中元素个数已经等于栈的最大容量 再往里面放元素 会报错此错误
-
Queue Underflow
队列下溢- 队列是空的 再从里面取元素 会报错此错误
-
知道了 栈
的数据结构后(如果不知道请翻阅上篇),队列
理解起来就特别简单了。首先 栈
是 先入后出
,类似于 羽毛球桶
。而 队列
是 先入先出
,类似于现实中的 排队
,先到的先排,后到的后排。
和栈差不多, 队列也有两个操作: 入队enqueue
和出队dequeue
。只不过队列是通过两个指针
来控制队列的入队和出队
。
JS实现一个队列
class Queue {
constructor(max = 10000) {
this.max = max; // 队列最大值
this.data = new Array(max); // 初始化空队列
this.p = 0; // 入队指针
this.q = 0; // 出队指针
this.size = 0; // 初始化队列大小
}
// 入队
enqueue(item) {
if (this.size >= this.max) {
throw new Error("Queue Overflow"); // 队列溢出
}
this.data[this.p++] = item; // 入队指针指向下一个地址
this.size++; // 队列大小 +1
if (this.p >= this.max) {
// 入队指针到头 重新回到队列初始位置 形成一个闭环
this.p = 0;
}
}
// 出队
dequeue() {
if (this.size === 0) {
throw new Error("Queue Underflow"); // 队列下溢
}
let target = this.data[this.q++];
this.size--;
if (this.q >= this.max) {
// 出队指针到头 重新回到队列的初始位置 形成一个闭环
this.q = 0;
}
return target;
}
}
测试一下
let p = new Queue();
p.enqueue(1);
p.enqueue(2);
p.enqueue(3);
p.enqueue(4);
p.enqueue(5);
p.enqueue(6);
console.log(p.dequeue(), p);
/*
1 Queue {
max: 10000,
data: [ 1, 2, 3, 4, 5, 6, <9994 empty items> ],
p: 6,
q: 1,
size: 5 }
*/
可以看到,new
了一个队列p
。又依次向队列p
中放了6个元素
。最后又取出了队列
中的一个元素,取出的元素
即是第一次
放进队列中的元素 1
。最后打印结果即是 1
,和队列p
,其中入队指针
指向了6
,出队指针
指向了1
。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。