引言
队列是遵循先进先出(FIFO)的数据存储结构。当然js中的栈也是建立在array基础上的,对array不熟悉的伙伴可以看一下我写的关于array的博文javascript基础–Array
1.队列的创建
function Queue(){
var items = [];//存储队列内容
//enqueue方法向队列尾部添加元素
this.enqueue = function(element){
items.push(element);
};
//dequeue方法移除队列首部元素
this.dequeue = function(){
return items.shift();
};
//front返回队列第一个元素,队列内容保持不变
this.front = function(){
return items[0];
};
//isEmpty判断队列内容是否为空
this.isEmpty = function(){
return items.length == 0;
};
//clear清除队列所有内容
this.clear = function(){
items = [];
};
//size返回队列内容长度
this.size = function(){
return items.length;
};
//print打印队列所有内容
this.print = function(){
console.log(items.toString());
};
}
2.队列的使用
var queue = new Queue();
console.log(queue.isEmpty());//true
queue.enqueue("John");
queue.enqueue("Jack");
queue.enqueue("Camila");
queue.print();//["John","Jack","Camila"]
console.log(queue.size());//3
console.log(queue.isEmpty());//false
queue.dequeue();
queue.dequeue();
queue.print();//['Camila']
3.优先队列
什么是优先队列,举个例子,拍卖,谁给的钱越多就卖给谁,不管你什么时候来的,不管你有多想要,没钱就排在后面捡剩下的。这和优先队列逻辑一致,每个元素都有自己的优先级,优先级越高,就不管先来后到,有“钱”(优先级高)就是王道。我们可以在默认队列上入列操作上做文章,使队列元素按照优先级进行排列,然后按照传统的队列操作元素即可。上代码。
function PriorityQueue(){
//priority越小,优先级越高
var items = [];
//构造元素,包含element和priority两个属性
function QueueElement(element,priority){
this.element = element;
this.priority = priority;
}
//改写入列操作,使元素按优先级排列
this.enqueue = function(element,priority){
var queueElement = new QueueElement(element,priority);
if(this.isEmpty()){
//如果队列是空的,直接插入元素
items.push(queueElement);
}else{
//队列非空,则需要遍历元素,比较优先级,将该元素插入优先级比自己低的前面
var added = false;
for(var i = 0;i < items.length;i++){
if(queueElement.priority < items[i].priority){
items.splice(i,0,queueElement);
added = true;
break;
}//如果优先级最低,则直接插入末尾
if(!added){
items.push(queueElement);
}
}
};
//其他操作与默认队列Queue一致
}
}
使用优先队列:
var priorityQueue = new PriorityQueue();
priorityQueue.enqueue("John",2);//['John']
priorityQueue.enqueue("Jack",1);//['Jack','John']
priorityQueue.enqueue("Camila",1);//['Jack','Camila','John']
priorityQueue.print();
4.循环队列
循环队列是什么?如果你把队列想象成一根管道,那么你把管道首尾相连便是循环队列了。循环队列的一个例子便是击鼓传花游戏,孩子们围成一个圈,开始传花,某一时刻停止,花在谁手里谁就被淘汰,直到剩下最后一名胜利者。上代码:
function resycleQueue(namelist, time){
var queue = new Queue();
//将游戏参与者姓名存入队列
for(var i = 0;i < namelist.length;i++){
queue.enqueue(namelist[i]);
}
var loser = '';
while(queue.size()>1){
for(var j = 0;j < time;j++){
//将队列头部移除的元素插入队列尾部实现循环
queue.enqueue(queue.dequeue());
}
//循环结束,移除淘汰者
loser = queue.dequeue();
consolo.log(loser+"被淘汰");
}
//队列元素只剩一个,返回最终胜利者
return queue.dequeue();
}
var names = ['A','B','C']
var winner = resycleQueue(names,10);
console.log('winner is' + winner);
结束语
将队列和生活中的示例结合起来学习,会加强自己的理解,队列,get!!!