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