队列是遵循FIFO(First In First Out,先进先出,也称为先来先服务)原则的一组有序的项。
队列在尾部添加新元素,并从顶部移除元素。最新添加的元素必须排在队列的末尾。只允许顶部删除,尾部添加,是一种受限的数据结构。
function Queue() {
var items = [];
this.enqueue = function(element){ //进入队列
items.push(element);
};
this.dequeue = function(){
return items.shift(); //顶部出去
};
this.front = function(){
return items[0]; //输出第一个元素
};
this.isEmpty = function(){
return items.length == 0;
};
this.clear = function(){
items = [];
};
this.size = function(){
return items.length;
};
this.print = function(){
console.log(items.toString());
};
}
使用示例:击鼓传花
修改游戏规则:几个人站在一圈数数,疏导某个数的人就淘汰,请问最后获胜的人原来的位置?淘汰后的重新开始数数是从淘汰位置的接下来的那个人开始数数。
实现的原理:通过队列,如果数到5的人淘汰的haul,那么将所有的人排成一个队列,进行图示的操作
第一个人输完1,然后就从当前队列移除,添加都=到当前队列的末尾,依次操作
函数封装
function passGame(namelist,baseNum){
var que = new Queue();
var len = namelist.length;
for(let i=0;i<len;i++){
que.enqueue(namelist[i])
}
// 最后只剩一个人
while(que.size()>1){
for(var j=0;j<baseNum-1;j++){
que.enqueue(que.dequeue())
}
que.dequeue()
}
let data = que.front()
console.log(data)
console.log(namelist.indexOf(data))
}
优先级队列
优先级队列的时候主要考虑的问题是:(1)此时的元素不再只是元素,而且包含数据的优先级(2)在添加的时候应该根据优先级添加适合的位置
优先级应用场景
封装优先级队列,此时假定数字越小优先级越高
function PriorityQueue() {
var items = [];
function QueueElement (element, priority){ // {1}
this.element = element;
this.priority = priority;
}
this.enqueue = function(element, priority){
var queueElement = new QueueElement(element, priority);
if (this.isEmpty()){
items.push(queueElement); // {2}
} else {
// 声明一个插入队列的表示
var added = false;
for (var i=0; i<items.length; i++){
if (queueElement.priority <items[i].priority){
items.splice(i,0,queueElement); // {3}
added = true;
break; // {4}
}
}
// added为false,表示当前数组中的元素的priority都小于queueElement.priority
if (!added){ //{5}
items.push(queueElement);
}
}
};
//其他方法和默认的Queue实现相同
}