最近一直在学习图数据结构,可是他用js实现须要用到字典,遍历的时候又须要用到栈,因此接下来我先把原来学习数据结构所记的笔记整理出来数组
队列:和咱们平常生活中的排队同样,遵循的是FIFO原则,及first in first out的原则
操做队列的方法有:数据结构
向尾部插入元素 enqueue()方法完成进队函数
删除头部的元素 dequeue()方法完成出队学习
返回队列中的第一个元素 front()方法 及最早进入队列和最早出队列的元素this
还有一些用于查询的方法:code
判断一个队列是否为空 isEmpty()方法 若是为空就返回true 若是不为空就返回false对象
返回数组的容量 size()方法队列
将一个数组打印出来 print()方法游戏
接下来,咱们将实现队列这个类,首先,定义一个队列的类,类中有一个私有数组,存放着咱们须要的元素:element
let Queue = function(){ let items = []; }
接下来,咱们来定义队列类的公共方法
//首先建立一个队列的类 let Queue = function(){ let items = []; //在数组末尾添加元素 this.enqueue = function(e){ items.push(e); } //删除最开头,也是最早添加的元素 this.dequeue = function(e){ return items.shift(); } //读取队列中的最早被添加 最早被删除的元素 this.front = function(){ return items[0]; } //判断数组是否为空,若是为空就返回true 反之 就返回false this.isEmpty = function(){ return items.length == 0; } //返回数组的容量 this.size = function(){ return items.length; } //打印数组 this.print = function(){ console.log(items.toString()); } }
就像现实生活中的订购特等舱的顾客先上机,订购经济舱的顾客后上机同样,优先队列就是对权重较大的元素(用1表示权重最大)优先进行操做,咱们有两种实现方法:
将不一样的元素设置优先级,根据优先及将元素添加到数组的正确位置,修改的是enqueue方法
用入列操做添加元素之后,按照元素的优先级执行出列,修改的是dequeue方法
咱们将用第一种方法进行实现(若是用第二种的话用字典会更加合适一些),其余方法都不变,咱们只对enqueue方法进行修改
//首先建立一个队列的类 var Queue = function(){ var items = []; function QueueElements(element,priority){ this.element = element; this.priority = priority; return this; } //在数组末尾添加元素 this.equeue = function(element,priority){ var item = new QueueElements(element,priority); if(this.isEmpty()){ items.push(item); }else{ var added = false; for(let i=0;i<items.length;i++){ //遍历数组中的元素,只要发现一个比他大的元素,就把item插到他前面 if(item.priority < items[i].priority){ items.splice(i,0,item); //一旦插入就将added值设为true added = true; } } if(!added){ items.push(item); } } }; } //删除最开头,也是最早添加的元素 //读取队列中的最早被添加 最早被删除的元素 //判断数组是否为空,若是为空就返回true 反之 就返回false //返回数组的容量 //打印数组 }
函数解释:这里的equeue方法 和 以往的 equeue方法区别就是,添加的元素是一个带有优先级属性的元素(QueueElements类new出来的一个对象),在添加以前先判断数组的是否为空,若是为空就直接插入,若是不为空就对优先级进行比较,只要找到比他大的就将该元素插入,将added设置为true,若是没有找到比他还大的,那么added依然是false,这时就将元素push到数组的最后
基本思想就是:若是没有轮到这个元素,就把该元素从头部删除添加到队列的末尾,若是传到了,就将该元素删除,继续循环剩下的元素
function hotPotato(namelist,num){ //建立一个新的队列 let queue = new Queue(); //将全部元素加入姓名的列表 for(let i=0;i<namelist.length;i++){ queue.enqueue(namelist[i]); } //循环指定必定的数组,若是到了就将循环到的那个数字从队列中删除 while(queue.size() > 1){ let nameitem = ""; for(let i=0;i<num;i++){ queue.enqueue(queue.dequeue()); } nameitem = queue.dequeue(); console.log(nameitem+"将被淘汰!"); } return queue.dequeue(); } //验证 let names = ["John","Jack","Camila","Ingrid","Carl"]; let result = new hotPotato(names,7); console.log("胜利者是:"+result);
函数解释:游戏不中止的条件是队列中元素的长度大于1,等于1时则择出胜利者,循环,当num不等于7时,就把末尾的移到队列前面,循环完毕,num=7,删除这个时候处在尾部的元素,继续执行上述操做,直至队列中只剩一个元素
以上是队列的所有内容,还望各位同仁大神指点一二,我虚心接受