摘要:我對隊列的學習什么是隊列隊列是遵循先進先出原則的一組有序的項。最新添加的元素必須排在隊列的末尾。隊列的學習隊列的操作其實是和棧是差不多的,但是隊列只允許新數(shù)據(jù)在后端進行添加。這里是最小優(yōu)先隊列,優(yōu)先值較小的元素被放置在隊列最前面。
我對JS隊列的學習 什么是隊列
隊列是遵循FIFO(先進先出)原則的一組有序的項。隊列在尾部添加新元素,并從頂部移除元素。最新添加的元素必須排在隊列的末尾。
在具體應用中通常用鏈表或者數(shù)組來實現(xiàn)。
隊列的學習隊列的操作其實是和棧是差不多的,但是隊列只允許新數(shù)據(jù)在后端進行添加。
1 創(chuàng)建隊列
聲明一個類
function Queue() { //這里是屬性和方法 }
需要一個用于存儲隊列中的元素的數(shù)據(jù)結構,這里選擇數(shù)組。
var items = [];
2 隊列的基本操作
添加元素到隊列(只能添加到隊列的末尾)
this.enqueue = function (element) { items.push(element); }
移除隊列的第一項,并返回被移除的元素
this.dequeue = function() { return items.shift(); }
獲取隊列最前面的元素
this.front = function() { return items[0]; }
判斷隊列是否為空
this.isEmpty = function() { return items.length == 0; }
隊列的長度
this.size = function() { return items.length; }
使用Queue類隊列和棧的區(qū)別是dequeue()方法和front()方法,這是因為先進先出和后進先出的原則不同。
1.初始化類,驗證是否為空
var queue = new Queue(); console.log(queue.isEmpty()); //true;
2.添加到隊列,判斷長度
queue.enqueue("John"); queue.enqueue("Jack"); queeu.enqueue("Camila"); console.log(queue.size()); //3
3.移除兩個元素,判斷長度
queue.dequeue(); queue.dequeeu(); console.log(queue.size()); //1;這時隊列只剩下Camila優(yōu)先隊列
對,這就是特權!比如登機,頭等艙商務艙能和經(jīng)濟艙的登機順序一樣??肯定他們的優(yōu)先級高啊
實現(xiàn)一個優(yōu)先隊列,有兩種選項:①設置優(yōu)先級,然后在正確的位置添加元素。②用入列操作添加元素,然后按照優(yōu)先級移除它們。
就是登機,你可以讓優(yōu)先級高的先進去候車室,然后登機的時候按順序理所當然的頭等艙的先登機。另一種就是頭等艙經(jīng)濟艙什么的進去候車室的時候不按優(yōu)先級,但是呢,等到登機的時候按照優(yōu)先級喊人進去。
function PriorityQueue() { var items = []; //創(chuàng)建一個元素包含了元素和優(yōu)先級 function QueueElement (element, priority) { this.element = element; thie.priority = priority; }; this.queue = function(element, priority) { var queueElement = new QueueElement(element, priority); //隊列為空,直接添加到隊列(因為這時根本不用比較優(yōu)先級?。? if(this.isEmpty()) { items.push(queueElement); } else { var added = false; //如果要添加的元素的優(yōu)先級小于某一位置元素,那么就把要添加的元素放在這一位置元素的前面(這里用了splice方法) //優(yōu)先級數(shù)字越小,優(yōu)先級越高,應該越早處理,所以應該越靠近隊列前面 for(var i = 0; i < items.length; i++) { if(queueElement.priority < items[i].priority) { items.splice(i, 0, queueElement); added = true; //插入新元素之后,終止隊列循環(huán) break; } } //到這一步就意味著所有的元素都比要添加的元素的優(yōu)先級低,所以直接放到末尾就可以 if(!added) { items.push(queueElement); } } }; }
var priorityQueue = new PriorityQueue(); priorityQueue.enqueue("John", 2); priorityQueue.enqueue("Jack", 1); priorityQueue.enqueue("Camila", 1);
得到的隊列就是 |Jack(1)|Camila(1)|John(2)|,優(yōu)先級相同只需要放到同優(yōu)先級的后面就可以。
這里是最小優(yōu)先隊列,優(yōu)先值較小的元素被放置在隊列最前面。
循環(huán)隊列擊鼓傳花,孩子們圍成一個圓圈,把花盡快的傳遞給旁邊的人,某一時刻傳花停止,這個時候花在誰手里誰就淘汰。重復這個過程直到只剩下一個孩子。
function hotPotato(nameList, num) { var queue = new Queue(); //將所有的名字放入隊列 for(var i = 0; i < nameList.length; i++) { queue.enqueue(nameList[i]); } var eliminated = ""; //一輪游戲淘汰一個人 while(queue.size() > 1) { //一輪游戲傳鼓7次 for(var i = 0; i < num; i++) { //傳鼓一次,你把花傳給別人,你就安全了(隊首的人拿花) //從隊列開頭移除一項放到隊尾 queue.enqueue(queue.dequeue()); } //一輪游戲結束,淘汰手里拿花的那個人,即隊首的那個 eliminated = queue.dequeue(); console.log(eliminated + "被淘汰"); } //得到最后的隊首 return queue.dequeue(); } var names = ["John", "Jack", "Camila", "Ingrid", "Carl"]; var winner = hotPotato(names, 7); console.log("勝利者" + winner);
結果:
Camila Jack Carl Ingrid依次被淘汰
勝利者:John
下一篇鏈表。。。。
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/86942.html
摘要:我對棧的學習因為是個新手,所以都是最簡單的知識學習梳理。棧是一種遵從后進先出原則的有序集合,新添加的或者待刪除的元素都保留在棧的末尾,稱作棧頂,另一端叫做棧底。棧的學習棧的創(chuàng)建創(chuàng)建一個類來表示棧。對于棧來說只能用和方法來進行添加和刪除元素。 我對棧的學習 因為是個新手,所以都是最簡單的知識學習梳理。 什么是棧 數(shù)組是計算機科學中最常用的數(shù)據(jù)結構,是數(shù)據(jù)元素的集合。有時候我們需要一種添加...
摘要:這兩個函數(shù)接受定時器的例如我們上面提到的兩個函數(shù)產(chǎn)生的定時器,并停止對定時器中指定函數(shù)的調(diào)用。注意,定時器雖然觸發(fā)了,但是并不會立即執(zhí)行,它只是把需要延遲執(zhí)行的函數(shù)加入了執(zhí)行隊列,在線程的某一個可用的時間點,這個函數(shù)就能夠得到執(zhí)行。 擼了今年阿里、頭條和美團的面試,我有一個重要發(fā)現(xiàn)....... javascript定時器工作原理是一個重要的基礎知識點。因為定時器在單線程中工作,它們表...
摘要:想必面試題刷的多的同學對下面這道題目不陌生,能夠立即回答出輸出個,可是你真的懂為什么嗎為什么是輸出為什么是輸出個這兩個問題在我腦邊縈繞。同步任務都好理解,一個執(zhí)行完執(zhí)行下一個。本文只是我對這道面試題的一點思考,有誤的地方望批評指正。 想必面試題刷的多的同學對下面這道題目不陌生,能夠立即回答出輸出10個10,可是你真的懂為什么嗎?為什么是輸出10?為什么是輸出10個10?這兩個問題在我腦...
摘要:前言前幾天在理解的事件環(huán)機制中引發(fā)了我對瀏覽器里的好奇。接下來理解瀏覽器中的,先看一張圖堆和棧堆是用戶主動請求而劃分出來的內(nèi)存區(qū)域,比如你,就是將一個對象存入堆中,可以理解為存對象。廢話不多說,直接上圖個人理解。參考資料運行機制詳解再談 前言 前幾天在理解node的事件環(huán)機制中引發(fā)了我對瀏覽器里Event Loop的好奇。我們都知道javascript是單線程的,任務是需要一個一個按順...
摘要:在這篇文章中,分享了他如何克服恐懼并開始使用源代碼來提高他的知識和技能。不久之后,你正在閱讀的源代碼將引導您進入規(guī)范。 通過閱讀源碼來提高js知識 原文傳送門:《Improve Your JavaScript Knowledge By Reading Source Code》 showImg(https://segmentfault.com/img/remote/14600000197...
閱讀 2460·2021-11-23 09:51
閱讀 2061·2021-10-14 09:43
閱讀 2845·2021-09-27 13:35
閱讀 1224·2021-09-22 15:54
閱讀 2607·2021-09-13 10:36
閱讀 3958·2019-08-30 15:56
閱讀 3482·2019-08-30 14:09
閱讀 1799·2019-08-30 12:57