跳到主要内容

队列

基本概念

只允许在表(线性表)的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。特点:

  • 先进先出(FIFO)
  • 数组或链表实现

名词解释:

  1. 入队:在队列中插入一个元素
  2. 出队:在队列中删除一个元素
  3. 指针:用两个指针管理,一个队头指针 front,指向队头元素;另一个队尾指针 rear,指向下一个入队元素的存储位置

顺序队列

定义数组,设置两个指针管理。队头指针 front、队尾指针 rear。当元素入队 rear+1,当元素出队 front+1

信息

假溢出:队尾指针指向数组的最后一个位置。但是队列没有填满

真溢出:队尾指针指向数组的最后一个位置。但是队列已经满了

顺序队列实现
class Queue {
constructor(n) {
this.arr = new Array(n);
this.front = 0;
this.rear = 0; // 尾指针指向最后一个元素的下一个位置
}
// 入队
enqueue(val) {
if (this.full()) return;
this.arr[this.rear++] = val;
}
// 出队
dequeue() {
if (this.empty()) return;
this.front++;
}
// 队列是否满了
full() {
return this.rear === this.arr.length;
}
// 队列是否为空
empty() {
return this.rear === this.front;
}
// 队列是否为空
size() {
return this.rear - this.front;
}
}

循坏队列

为了使队列空间能重复使用,把队列空间想象成一个环形空间,环形空间中的存储单元循坏使用。

循坏队列实现
class Queue {
construct(n) {
this.arr = new Array(n);
this.front = this.rear = 0;
this.count = 0;
}
enqueue(val) {
if (this.full()) return;
this.arr[this.rear++] = val;
this.rear = this.rear % this.arr.length;
this.count++;
}
dequeue() {
if (this.empty()) return;
this.front++;
this.front = this.front % this.arr.length;
this.count--;
}
empty() {
return this.count === 0;
}
full() {
return this.count === this.arr.length;
}
size() {
return this.count;
}
}

算法题

622 设计循环队列

641 设计双端循环队列

933 最近请求次数