最近一直在學習圖數據結構,可是他用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,刪除這個時候處在尾部的元素,繼續執行上述操做,直至隊列中只剩一個元素
以上是隊列的所有內容,還望各位同仁大神指點一二,我虛心接受