摘要:在隊列的這種數(shù)據(jù)結(jié)構(gòu)里面,新增的元素都在尾部,要移除的元素都在頂部。代碼實現(xiàn)下面用代碼來實現(xiàn)隊列這個數(shù)據(jù)結(jié)構(gòu),同樣都采用的語法,我們先定義一個類來表示隊列,然后在這個類的基礎(chǔ)上定義一下方法來模擬隊列的行為。
隊列和棧非常的類似,但是他們采用了不同的原則,棧采用的是后進先出,隊列正好相反,采用的是先進先出的原則。隊列的定義如下
隊列是遵循FIFO(先進先出)原則的有序集合,新添加的元素保存在隊列的尾部,要移除的元素保存在隊列的頂部。在隊列的這種數(shù)據(jù)結(jié)構(gòu)里面,新增的元素都在尾部,要移除的元素都在頂部。
舉一個生活中的例子,在我們平時去吃肯德基吃飯時肯定要排隊,這條隊伍就可以看做是一個隊列,排在隊伍前面的就是隊列的頂部,隊伍后面的就是隊列的尾部,后來的人都要排在隊伍的后面(隊列的尾部),這就符合了隊列先進先出的原則了(先排隊的可以先點餐)。
代碼實現(xiàn)下面用代碼來實現(xiàn)隊列這個數(shù)據(jù)結(jié)構(gòu),同樣都采用ES6的語法,我們先定義一個類Queue來表示隊列,然后在這個類的基礎(chǔ)上定義一下方法來模擬隊列的行為。
class Queue { constructor() { // 定義一個數(shù)組來保存隊列里面的元素 this.items = [] } // 在隊列尾部添加一個或者多個元素 enqueue(element) { } // 移除隊列頂部的元素,并返回被移除的元素 dequeue() { } // 清空隊列 remove() { } // 返回隊列頂部的元素,不對隊列本身做修改 front() { } // 判斷隊列是否為空 isEmpty() { } // 返回隊列里面元素的個數(shù) length() { } }
這樣我們就定義好一個基類了,下面來分別實現(xiàn)隊列的行為方法
enqueue第一個要實現(xiàn)的就是enqueue方法,這個方法接收一個參數(shù),然后把該參數(shù)插入隊列的尾部,因為這里我們是用數(shù)組來存儲隊列的元素的,所以可以用數(shù)組的push方法來實現(xiàn)該操作,代碼如下
enqueue (element) { this.items.push(element) }dequeue
下面接著實現(xiàn)dequeue方法,這個方法會從隊列里面移除項,由于隊列遵循的是先進先出的原則,所以我們要移除的元素就是隊列頂部的元素,同樣因為這里我們是用數(shù)組來存儲隊列的元素的,所以可以用數(shù)組的shift方法來實現(xiàn)該操作。代碼如下
dequeue () { return this.items.shift() }remove
接著來實現(xiàn)remove方法,改方法會移除隊列里面所有的項,同理我們把保存隊列元素的數(shù)組置空就好了,代碼如下
remove () { this.items = [] }front
上面的方法都是對隊列本身有修改的,接下來要實現(xiàn)的方法front做的是只讀操作,front方法會返回隊列頂部的元素但不對隊列本身進行修改,代碼實現(xiàn)如下
front () { return this.items[0] }isEmpty
isEmpty方法判斷隊列是否為空,也就是保存隊列的數(shù)組的長度是否等于0,代碼實現(xiàn)如下
isEmpty () { return this.items.length === 0 }length
最后一個方法返回隊列的長度,同理就是返回保存隊列元素的數(shù)組的長度就好了,代碼如下
length () { return this.item.length }
這里和棧一樣添加一個輔助方法print來打印棧里面的元素,方便我們觀察調(diào)試,這個方法和隊列的行為無關(guān),只是一個輔助方法
print(){ this.items.forEach((item, index) => { console.log(`${index+1}:${item}`) }) }
這樣隊列的方法就全部寫好了,最后完整Queue類的代碼如下
class Queue { constructor() { // 定義一個數(shù)組來保存隊列里面的元素 this.items = [] } // 在隊列尾部添加一個或者多個元素 enqueue (element) { this.items.push(element) } // 移除隊列頂部的元素,并返回被移除的元素 dequeue() { return this.items.shift() } // 清空隊列 remove() { this.items = [] } // 返回隊列頂部的元素,不對隊列本身做修改 front() { return this.items[0] } // 判斷隊列是否為空 isEmpty() { return this.items.length === 0 } // 返回隊列里面元素的個數(shù) length() { return this.item.length } print(){ this.items.forEach((item, index) => { console.log(`${index+1}:${item}`) }) } }使用Queue類
要使用這個類我們得先實例化它
const queue = new Queue() queue.isEmpty() // true queue.push("我是隊列的第一個元素") queue.push("我是隊列的第二個元素") queue.print() // 1: 我是隊列的第一個元素 2:我是隊列的第二個元素 queue.dequeue() // 我是隊列的第一個元素 queue.front() // 我是隊列的第二個元素 queue.length() // 1 queue.isEmpty() // false queue.remove() // 這時隊列里面已經(jīng)沒有元素了 queue.isEmpty() // true總結(jié)
隊列這種數(shù)據(jù)結(jié)構(gòu)運用的是非常的廣泛的,就比如javaScript的運行機制,我們都知道javaScript是單線程的,是不能同時執(zhí)行多個任務(wù),但是單線程就意味著所有任務(wù)需要排隊。但是在javaScript里面,很多時候阻止線程運行的很慢的是網(wǎng)絡(luò)IO之類,這時候CPU是空閑的,這樣就會造成資源的浪費。所以javaScript在主線程之外實現(xiàn)了一個任務(wù)隊列,像IO之類比較慢的操作暫時都會掛在任務(wù)隊列上,這樣不會影響到主線程上任務(wù)的執(zhí)行,等到IO的響應(yīng)回來后再回到主線程上來執(zhí)行掛起的任務(wù)。例子就是我們的Ajax請求,定時器等。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/88724.html
摘要:原文地址學習數(shù)據(jù)結(jié)構(gòu)一棧和隊列博主博客地址的個人博客幾乎所有的編程語言都原生支持數(shù)組類型,因為數(shù)組是最簡單的內(nèi)存數(shù)據(jù)結(jié)構(gòu)。他們就是棧和隊列。我們稱作棧頂,而另一端我們稱作棧底。移除棧頂?shù)脑?,同時返回被移除元素。 前言 只要你不計較得失,人生還有什么不能想法子克服的。 原文地址:學習javascript數(shù)據(jù)結(jié)構(gòu)(一)——棧和隊列 博主博客地址:Damonare的個人博客 幾乎所有的編程...
摘要:而函數(shù)調(diào)用結(jié)束返回時,運行時會將棧頂?shù)恼{(diào)用結(jié)構(gòu)彈出。并發(fā)模型與引擎是單線程的,它的并發(fā)模型基于事件循環(huán)當線程中的同步任務(wù)執(zhí)行完,執(zhí)行棧為空時,則從任務(wù)隊列中取出異步任務(wù)進行處理。在當前的微任務(wù)沒有執(zhí)行完成時,是不會執(zhí)行下一個宏任務(wù)的。 堆/棧/隊列 在javascript中,存在調(diào)用棧 (call stack)和內(nèi)存堆(memory heap) ,程序中函數(shù)依次進入棧中等待執(zhí)行,若執(zhí)行...
摘要:異步任務(wù)必須指定回調(diào)函數(shù),當異步任務(wù)從任務(wù)隊列回到執(zhí)行棧,回調(diào)函數(shù)就會執(zhí)行。事件循環(huán)主線程從任務(wù)隊列中讀取事件,這個過程是循環(huán)不斷的,所以整個的這種運行機制又稱為。事件循環(huán)事件循環(huán)是指主線程重復(fù)從消息隊列中取消息執(zhí)行的過程。 參考鏈接:這一次,徹底弄懂 JavaScript 執(zhí)行機制https://zhuanlan.zhihu.com/p/...從瀏覽器多進程到JS單線程,JS運行機制...
摘要:是怎么執(zhí)行的一開始先簡單聊了聊基本的數(shù)據(jù)結(jié)構(gòu),它和我們現(xiàn)在說的事件環(huán)有什么關(guān)系么當然有,首先要明確的一點是,代碼的執(zhí)行全都在棧里,不論是同步代碼還是異步代碼,這個一定要清楚。 棧和隊列 在計算機內(nèi)存中存取數(shù)據(jù),基本的數(shù)據(jù)結(jié)構(gòu)分為棧和隊列。 棧(Stack)是一種后進先出的數(shù)據(jù)結(jié)構(gòu),注意,有時候也管棧叫做堆棧,但是堆又是另一種復(fù)雜的數(shù)據(jù)結(jié)構(gòu),它和棧完全是兩碼事。棧的特點是操作只在一端進行...
今天我們講講JavaScript隊列數(shù)據(jù)結(jié)構(gòu)詳解。 什么是隊列? 隊列是一種先進先出的數(shù)據(jù)結(jié)構(gòu),隊列有兩種操作:插入和刪除;入隊和出隊。簡單來說就是允許插入的一端稱為隊尾、允許刪除的一端稱為隊頭; 如下圖展示了棧這個數(shù)據(jù)結(jié)構(gòu): JavaScript中的隊列 要知道JavaScript中沒有有關(guān)隊列的數(shù)據(jù)模型,因此我們需要通過數(shù)組進行模擬,當數(shù)組中提供的push()和shift()選...
閱讀 2438·2021-09-01 10:41
閱讀 1452·2019-08-30 14:12
閱讀 522·2019-08-29 12:32
閱讀 2869·2019-08-29 12:25
閱讀 2945·2019-08-28 18:30
閱讀 1716·2019-08-26 11:47
閱讀 994·2019-08-26 10:35
閱讀 2602·2019-08-23 18:06