最近一直在学习图数据结构,但是他用js实现需要用到字典,遍历的时候又需要用到栈,所以接下来我先把原来学习数据结构所记的笔记整理出来

队列基本知识

队列:和我们日常生活中的排队一样,遵循的是FIFO原则,及first in first out的原则
操作队列的方法有:

  1. 向尾部插入元素 enqueue()方法完成进队

  2. 删除头部的元素 dequeue()方法完成出队

  3. 返回队列中的第一个元素 front()方法 及最先进入队列和最先出队列的元素

还有一些用于查询的方法:

  1. 判断一个队列是否为空 isEmpty()方法 如果为空就返回true 如果不为空就返回false

  2. 返回数组的容量 size()方法

  3. 将一个数组打印出来 print()方法

接下来,我们将实现队列这个类,首先,定义一个队列的类,类中有一个私有数组,存放着我们需要的元素:

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表示权重最大)优先进行操作,我们有两种实现方法:

  1. 将不同的元素设置优先级,根据优先及将元素添加到数组的正确位置,修改的是enqueue方法

  2. 用入列操作添加元素以后,按照元素的优先级执行出列,修改的是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,删除这个时候处在尾部的元素,继续执行上述操作,直至队列中只剩一个元素

以上是队列的全部内容,还望各位同仁大神指点一二,我虚心接受


maxmin
226 声望6 粉丝