核心提示:引言 队列是遵循先进先出(FIFO)的数据存储结构。当然js中的栈也是建立在array基础上的,对array不熟悉的伙伴可以看一下我写的关于array的博文Array1.队列的创建function Q...
引言
队列是遵循先进先出(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!!!