队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表。 在具体应用中一般用链表或者数组来实现。 队列只容许在后端(称为rear)进行插入操做, 在前端(称为front)进行删除操做。 队列的操做方式和堆栈相似, 惟一的区别在于队列只容许新数据在后端进行添加。
以上是 维基百科 关于队列的描述,转换为人话就是大概这么几条:前端
先入先出
的数据结构两个指针进行操做数据后端
入队
指针出队
指针两个异常数组
Queue Overflow
队列溢出数据结构
Queue Underflow
队列下溢测试
知道了 栈
的数据结构后(若是不知道请翻阅上篇),队列
理解起来就特别简单了。首先 栈
是 先入后出
,相似于 羽毛球桶
。而 队列
是 先入先出
,相似于现实中的 排队
,先到的先排,后到的后排。this
和栈差很少, 队列也有两个操做: 入队enqueue
和出队dequeue
。只不过队列是经过两个指针
来控制队列的入队和出队
。spa
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
。指针