概述
队列是一种先进先出(First-In-First-Out,FIFO)的数据结构。队列被用在很多地方,比如 提交操作系统执行的一系列进程、打印任务池等,一些仿真系统用队列来模拟银行或杂货 店里排队的顾客。
主要方法和属性
- enqueue 向队列末尾添加一个元素
- dequeue 删除队首元素
- front 读取队首元素
- back 读取队尾元素
- empty 判断队列是否为空
- length 获取队列长度
javascript实现
class Queue {
constructor() {
this.dataStore = [];
}
// 向队列末尾添加一个元素
enqueue(element) {
this.dataStore.push(element)
}
// 删除队首元素
dequeue() {
return this.dataStore.shift();
}
// 读取队首元素
front() {
return this.dataStore[0];
}
// 读取队尾元素
back() {
return this.dataStore[this.dataStore.length - 1];
}
// 判断队列是否为空
empty() {
return this.dataStore.length === 0;
}
// 获取队列长度
length() {
return this.dataStore.length;
}
}
使用场景
- 使用队列对数据进行排序
对于 0~99 的数字,基数排序将数据集扫描两次。第一次按个位上的数字进行排序,第二 次按十位上的数字进行排序。每个数字根据对应位上的数值被分在不同的盒子里。
const originArr = [91, 31, 92, 22, 85, 15, 35, 46];
const getQueuesMap = () => {
const queueMap = {};
for(let i = 0; i < 10; i++) {
queueMap[i] = new Queue();
}
return queueMap;
}
const sortArr = (array) => {
const singleQueue = getQueuesMap();
const finalQueue = getQueuesMap();
for(let i = 0; i < array.length; i++) {
const singleNum = array[i]%10;
singleQueue[singleNum].enqueue(array[i]);
}
for(let i in singleQueue) {
while(singleQueue[i].dataStore.length) {
const num = singleQueue[i].dequeue();
const digitNum = Math.floor( num / 10);
finalQueue[digitNum].enqueue(num);
}
}
return Object.values(finalQueue).map(item => item.dataStore).flat();
}
console.log(sortArr(originArr));
console.log(sortArr([45,72, 93, 51, 21, 16, 70, 41, 27, 31]))
总结
队列在前端实际开发场景中运用的不多,尤其在js中原生实现了数组。我们可以通过数组使用所有队列或者栈所覆盖的场景,但是了解队列这种数据结构有助于拓宽我们的视野,为后续的算法学习打下基础