概念
队列是遵从先进先出的有序集合。
添加新元素的一端叫对首,另一端则叫队尾。
队列的实现
- inQueue() 入队
- outQueue() 出队
- top() 获取队首值
- size() 队列的长度
- clear() 清空队列
基于数组的队列实现
class Queue {
queue = []; // 队列数据存储
count = 0; // 队列计数
inQueue(val) {
this.queue[this.count++] = val;
}
outQueue() {
if(this.isEmpty()) return;
this.count--;
return this.queue.shift();
}
isEmpty() {
return this.count === 0;
}
top() {
if(this.isEmpty()) return;
return this.queue[0]
}
size() {
return this.count;
}
clear() {
this.queue = [];
// or
// this.queue.length = 0;
// this.count = 0;
}
}
基于对象的队列实现
class Queue {
queue = {};
count = 0;
head = 0; // 用于记录队首的键
inQueue(val) {
this.queue[this.count++] = val;
}
outQueue() {
if(this.isEmpty()) return;
const headData = this.queue[this.head];
delete this.queue[this.head];
this.head++;
this.count--;
return headData;
}
isEmpty() {
return this.count === 0;
}
top() {
return this.queue[this.head];
}
size() {
return this.count;
}
clear() {
this.queue = {};
this.count = 0;
this.head = 0;
}
}
双端队列
概念
可以同时从队首和队尾两端进行存取操作的队列。
与JS中的数组很相似,不同的是,双端队列不允许在数组两端以外的地方进行操作。
实现
class Deque {
constructor() {
this.queue = {}
this.count = 0;
this.head = 0;
}
// 队首添加
addFront (item) {
this.queue[--this.head] = item;
}
// 队尾添加
addBack (item) {
this.queue[this.count++] = item
}
// 移除队首
removeFront () {
if (this.isEmpty()) return;
const headData = this.queue[this.head];
delete this.queue[this.head++];
return headData;
}
// 移除队尾
removeBack () {
if (this.isEmpty()) return;
const backData = this.queue[this.count-1];
delete this.queue[--this.count];
return backData;
}
// 获取队尾值
backTop () {
if (this.isEmpty()) return;
return this.queue[this.count - 1];
}
// 获取队首值
frontTop() {
if (this.isEmpty()) return;
return this.queue[this.head];
}
size () {
return this.count - this.head
}
isEmpty () {
return this.size() === 0
}
}
使用场景
队列的最大值
https://leetcode-cn.com/problems/dui-lie-de-zui-da-zhi-lcof/