什么是隊(duì)列?
當(dāng)我們?cè)跒g覽器中打開新標(biāo)簽時(shí),就會(huì)創(chuàng)建一個(gè)任務(wù)隊(duì)列
。這是因?yàn)槊總€(gè)標(biāo)簽都是單線程處
理所有的任務(wù),它被稱為事件循環(huán)
。瀏覽器要負(fù)責(zé)多個(gè)任務(wù),如渲染HTML,執(zhí)行JavaScript代碼,處理用戶交互(用戶輸入、鼠標(biāo)點(diǎn)擊等),執(zhí)行和處理異步請(qǐng)求。
隊(duì)列(Queue)
是一種具有先進(jìn)先出(FIFO, First-In-First-Out)特性的數(shù)據(jù)結(jié)構(gòu),它可以用于在計(jì)算機(jī)程序中管理和存儲(chǔ)元素。在JavaScript中,可以使用數(shù)組(Array)或鏈表(Linked List)等數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)隊(duì)列。
其實(shí)可以用窗口排隊(duì)打飯為案例,先來(lái)的先排隊(duì)打飯。
創(chuàng)建隊(duì)列
隊(duì)列主要有兩個(gè)基本操作: 入隊(duì)(enqueue)和出隊(duì)(dequeue)。在隊(duì)列中,新元素被添加到隊(duì)列末尾,并等待其他已存在的元素被處理后才能被移除。當(dāng)刪除元素時(shí),總是從隊(duì)首開始移除元素。
新建隊(duì)列
創(chuàng)建類來(lái)表示一個(gè)隊(duì)列,先從最基本的聲明類開始:
function Queue() {
//這里是屬性和方法
}
需要一個(gè)用于存儲(chǔ)隊(duì)列中元素的數(shù)據(jù)結(jié)構(gòu),使用數(shù)組,(Queue類和Stack類非常類似,只是添加和移除元素的原則不同):
function Queue() {
//用于存儲(chǔ)隊(duì)列中元素的數(shù)據(jù)結(jié)構(gòu)
let items = [];
//這里是屬性和方法
}
隊(duì)列可用的方法
- enqueue(element(s)):向隊(duì)列尾部添加一個(gè)(或多個(gè))新的項(xiàng)。
- dequeue():移除隊(duì)列的第一(即排在隊(duì)列最前面的)項(xiàng),并返回被移除的元素。
- front():返回隊(duì)列中第一個(gè)元素——最先被添加,也將是最先被移除的元素。隊(duì)列不
做任何變動(dòng)(不移除元素,只返回元素信息——與Stack類的peek方法非常類似)。 - isEmpty():如果隊(duì)列中不包含任何元素,返回true,否則返回false。
- size():返回隊(duì)列包含的元素個(gè)數(shù),與數(shù)組的length屬性類似。
隊(duì)列添加元素
首先要實(shí)現(xiàn)的是enqueue方法。這個(gè)方法負(fù)責(zé)向隊(duì)列添加新元素。這里有一個(gè)非常重要的細(xì)
節(jié),新的項(xiàng)只能添加到隊(duì)列末尾:
this.enqueue = function(element){
items.push(element);
};
隊(duì)列移除元素
接下來(lái)要實(shí)現(xiàn)dequeue方法。這個(gè)方法負(fù)責(zé)從隊(duì)列移除項(xiàng)。由于隊(duì)列遵循先進(jìn)先出原則,
最先添加的項(xiàng)也是最先被移除的??梢杂胹hift方法,shift方法會(huì)從數(shù)組中移除存儲(chǔ)在索引0(第一個(gè)位置)的元素:
this.dequeue = function(){
return items.shift();
};
只有enqueue方法和dequeue方法可以添加和移除元素,這樣就確保了Queue類遵循先進(jìn)先
出原則。
隊(duì)列查看元素
查看隊(duì)列頭元素
現(xiàn)在來(lái)為我們的類實(shí)現(xiàn)一些額外的輔助方法。如果想知道隊(duì)列最前面的項(xiàng)是什么,可以用
front方法。這個(gè)方法會(huì)返回隊(duì)列最前面的項(xiàng)(數(shù)組的索引為0):
this.front = function(){
return items[0];
};
檢查隊(duì)列是否為空
可以直接使用length == 0判斷,如果隊(duì)列為空,它會(huì)返回true,否則返回false):
this.isEmpty = function(){
return items.length == 0;
};
檢查隊(duì)列的長(zhǎng)度
類似于數(shù)組的length屬性,我們也能實(shí)現(xiàn)隊(duì)列的length。對(duì)于集合,最好用size代替length。
因?yàn)殛?duì)列的內(nèi)部使用數(shù)組保存元素,所以能簡(jiǎn)單地返回隊(duì)列的長(zhǎng)度:
this.size = function(){
return items.length;
};
打印隊(duì)列元素
為了檢查隊(duì)列元素,實(shí)現(xiàn)一個(gè)輔助方法print。把隊(duì)列元素都輸出到控制臺(tái):
this.print = function(){
console.log(items.toString());
};
完整隊(duì)列代碼
function Queue() {
//用于存儲(chǔ)隊(duì)列中元素的數(shù)據(jù)結(jié)構(gòu)
let items = [];
//隊(duì)列添加元素
this.enqueue = function(element){
items.push(element);
};
//隊(duì)列移除元素
this.dequeue = function(){
return items.shift();
};
//查看隊(duì)列頭元素
this.front = function(){
return items[0];
};
//檢查隊(duì)列的長(zhǎng)度
this.size = function(){
return items.length;
};
//打印隊(duì)列元素
this.print = function(){
console.log(items.toString());
};
}
循環(huán)隊(duì)列
循環(huán)隊(duì)列,修改版的隊(duì)列實(shí)現(xiàn)。為了解決假上溢問(wèn)題,引入循環(huán)隊(duì)列,即把向量空間想象為一個(gè)首尾相接的圓環(huán),在循環(huán)隊(duì)列中進(jìn)行出隊(duì)、入隊(duì)操作時(shí),頭尾指針仍要加1,朝前移動(dòng)。只不過(guò)當(dāng)頭尾指針指向向量上界(MAXNUM-1)時(shí),其加1操作的結(jié)果是指向向量的下界0。
優(yōu)先隊(duì)列是什么?
優(yōu)先隊(duì)列,隊(duì)列修改版。元素的添加和移除是基于優(yōu)先級(jí)的?,F(xiàn)實(shí)的例子有就是機(jī)場(chǎng)登機(jī)的順序,頭等艙和商務(wù)艙乘客的優(yōu)先級(jí)要高于經(jīng)濟(jì)艙乘客;迪士尼入園vip先入園等等。
實(shí)現(xiàn)一個(gè)優(yōu)先隊(duì)列,有兩種選項(xiàng):設(shè)置優(yōu)先級(jí),然后在正確的位置添加元素;或者用入列操
作添加元素,然后按照優(yōu)先級(jí)移除它們。因此可以對(duì)它們使用默認(rèn)的出列操作:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-486328.html
總結(jié)
在JavaScript中,隊(duì)列(Queue)是一種具有先進(jìn)先出(FIFO, First-In-First-Out)特性的數(shù)據(jù)結(jié)構(gòu),它可以用于在計(jì)算機(jī)程序中管理和存儲(chǔ)元素。隊(duì)列中,新元素被添加到隊(duì)列末尾,并等待其他已存在的元素被處理后才能被移除。當(dāng)刪除元素時(shí),總是從隊(duì)首開始移除元素。隊(duì)列主要有兩個(gè)基本操作: 入隊(duì)(enqueue)和出隊(duì)(dequeue),在JavaScript中可以使用數(shù)組(Array)或鏈表(Linked List)等數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)隊(duì)列。除了入隊(duì)和出隊(duì)操作,隊(duì)列還可以提供其他方法,如peek()返回隊(duì)列頭部的值、isEmpty()判斷隊(duì)列是否為空等等,但其基本實(shí)現(xiàn)都是基于入隊(duì)和出隊(duì)這兩個(gè)基本操作。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-486328.html
到了這里,關(guān)于在JavaScript中的數(shù)據(jù)結(jié)構(gòu)(隊(duì)列)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!