數據結構——隊列

最近一直在學習圖數據結構,可是他用js實現須要用到字典,遍歷的時候又須要用到棧,因此接下來我先把原來學習數據結構所記的筆記整理出來數組

隊列基本知識

隊列:和咱們平常生活中的排隊同樣,遵循的是FIFO原則,及first in first out的原則
操做隊列的方法有:數據結構

  1. 向尾部插入元素 enqueue()方法完成進隊函數

  2. 刪除頭部的元素 dequeue()方法完成出隊學習

  3. 返回隊列中的第一個元素 front()方法 及最早進入隊列和最早出隊列的元素this

還有一些用於查詢的方法:code

  1. 判斷一個隊列是否爲空 isEmpty()方法 若是爲空就返回true 若是不爲空就返回false對象

  2. 返回數組的容量 size()方法隊列

  3. 將一個數組打印出來 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表示權重最大)優先進行操做,咱們有兩種實現方法:

  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,刪除這個時候處在尾部的元素,繼續執行上述操做,直至隊列中只剩一個元素

以上是隊列的所有內容,還望各位同仁大神指點一二,我虛心接受

相關文章
相關標籤/搜索