队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表。
在具体应用中通常用链表或者数组来实现。
队列只允许在后端(称为rear)进行插入操作,
在前端(称为front)进行删除操作。
队列的操作方式和堆栈类似,
唯一的区别在于队列只允许新数据在后端进行添加。

解释

以上是 维基百科 关于队列的描述,转换为人话就是大概这么几条:

  • 先入先出 的数据结构
  • 两个指针进行操作数据

    • 入队 指针
    • 出队 指针
  • 两个异常

    • Queue Overflow 队列溢出

      • 队列中元素个数已经等于栈的最大容量 再往里面放元素 会报错此错误
    • Queue Underflow 队列下溢

      • 队列是空的 再从里面取元素 会报错此错误

知道了 的数据结构后(如果不知道请翻阅上篇),队列 理解起来就特别简单了。首先 先入后出 ,类似于 羽毛球桶 。而 队列先入先出 ,类似于现实中的 排队 ,先到的先排,后到的后排。

和栈差不多, 队列也有两个操作: 入队enqueue和出队dequeue。只不过队列是通过两个指针来控制队列的入队和出队
image.png

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


Funky_Tiger
443 声望33 粉丝

刷题,交流,offer,内推,涨薪,相亲,前端资源共享...