版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Mr_JavaScript/article/details/84557544
概念:只允许在表的前端(front)进行删除操作,在表的后端(rear)进行插入操作的一种特殊线性表
核心思想:先进先出
分类:1)循环队列:普通队列的首尾相接形成圆环,这样的队列称为循环队列(Circular Queue)
2)优先队列:普通队列的元素被赋予了优先级,具有最高优先级的元素最先删除,这样的队列称为优先队列(Priority Queue)
操作方法:1)enqueue() 入列,即元素插入队列
2)dequeue() 出列,即从队列删除元素
3)front() 查找队列头
4)isEmpty() 判断队列是否为空
5)size() 队列大小
应用场景:适用于多任务同步进行操作的场景,根据优先权选择优先级高的优先处理。
队列的理解:把队列比作是一个排队的过程,机场里检票登机的时候,谁先排队的谁就优先检票(先进先出),但是有某些人是VIP会员,可以走VIP通道会比大部分人都优先登机(优先队列)。
实例
1、队列的操作方法
/* 定义一个队列类 */
function Queue(){
/* 一个队列 */
let arr = [];
/* 查询队列 */
this.getQueue = ()=>{
return arr;
},
/* 入列 */
this.enqueue = (element)=>{
arr.push(element);
},
/* 出列 */
this.dequeue = ()=>{
return arr.shift();
},
/* 查看队列头 */
this.front = ()=>{
return arr[0]
},
/* 判断队列是否为空 */
this.isEmpty = ()=>{
return arr.length == 0;
},
/* 查询队列大小(即数组长度) */
this.size = ()=>{
return arr.length;
}
}
2、循环队列,破解击鼓传花的游戏
/*
击鼓传花的游戏:
一群人围城一圈,一朵花从某个人开始顺时针依次传递,第三次传递拿到花者出局,从下一位又重新开始,已旧是第三次传递拿到花者出局,游戏以这规则进行下去,直到只剩下一个人,即为最终胜利者
*/
/*
循环队列方法解决问题:
用一个数组代表一圈人,第一次传花把数组第一项拿出插入到数组尾,第二次传花(在第一次基础上)又把数组的第一项拿出插入到数组尾,第三次(在第二次基础上)删除第一项(出局),依次进行下去,直到数组只剩下一项
*/
function PassTheParcel(people){
let q = new Queue(); // 调用队列的操作方法
for(item of people){
q.enqueue(item); //元素一个个入栈
}
while(q.size()>1){
for(let i=0; i<2; i++ ){ //第一次和第二次传花
q.enqueue(q.dequeue()); //拿出第一项插入尾部
}
q.dequeue(); //第三次出局
}
return '最终胜利者' + q.getQueue();
}
3、优先队列,根据优先级插入队列
/* 定义一个优先队列类 */
function PriorityQueue(){
// 优先队列数组
let items = [];
// 定义一个辅助类(用于创建一项具有优先级的元素)
function AuxiliaryClass(element,priority){
this.element = element; // 元素名称
this.priority = priority; // 优先级标识
}
// 优先队列元素入列的方法
this.enqueue = (element,priority)=>{
let queueItem = new AuxiliaryClass(element,priority); // 调用辅助类创建一个元素
let added = false;
for(let i=0,len=items.length; i<len; i++){
if(queueItem.priority > items[i].priority){ // 与每一项做比较,若优先级比较高,则插入其前面,结束比较
items.splice(i,0,queueItem);
added = true;
break;
}
}
if(!added){ // 比队列的所有项都小,则插入尾部
items.push(queueItem);
}
};
this.getPriorityQueue = ()=>{
return items;
};
}
(完)