隊(duì)列的定義
隊(duì)列是遵循先進(jìn)先出原則的一組有序的項(xiàng),與棧的不同的是,棧不管是入棧還是出棧操作都是在棧頂操作,隊(duì)列則是在隊(duì)尾添加元素,隊(duì)頂移除,用一個(gè)圖來表示大概是這樣事的:
用一個(gè)更形象的例子就是:排隊(duì)服務(wù),總是先排隊(duì)的人會(huì)先接受服務(wù),當(dāng)然不考慮插隊(duì)的情況
與棧的創(chuàng)建類似,首先創(chuàng)建一個(gè)表示隊(duì)列的函數(shù),然后定義一個(gè)數(shù)組用來保存隊(duì)列里的元素:
function Queue() { let items = [] }
創(chuàng)建隊(duì)列后需要為其定義一些方法,一般來說隊(duì)列包含以下方法:
enqueue(element):向隊(duì)的尾部添加一個(gè)新的項(xiàng)
dequeue():移除隊(duì)列第一項(xiàng),并返回被移除的元素
front():返回隊(duì)列第一項(xiàng),隊(duì)列不做任何變動(dòng)
isEmpty():如果隊(duì)列中沒有任何元素返回true,否則返回false
size():返回隊(duì)列包含的元素個(gè)數(shù)
具體實(shí)現(xiàn):
function Queue() { let items = [] // 向隊(duì)列的尾部添加新元素 this.enqueue = function (element) { items.push(element) } // 遵循先進(jìn)先出原則,從隊(duì)列的頭部移除元素 this.dequeue = function () { return items.shift() } // 返回隊(duì)列最前面的項(xiàng) this.front = function () { return items[0] } // 返回隊(duì)列是否為空 this.isEmpty = function () { return items.length === 0 } // 返回隊(duì)列的長(zhǎng)度 this.size = function () { return items.length } // 打印隊(duì)列,方便觀察 this.print = function () { console.log(items.toString()) } }隊(duì)列的使用
接下來讓我們看看隊(duì)列的使用:
let queue = new Queue() queue.enqueue("a") queue.enqueue("b") queue.enqueue("c") queue.dequeue() queue.print()
首先向隊(duì)列中添加三個(gè)元素:a,b,c,然后移除隊(duì)列中的一個(gè)元素,最后打印現(xiàn)有隊(duì)列,讓我們一起圖解這個(gè)過程:
es6實(shí)現(xiàn)Queue和實(shí)現(xiàn)Stack類一樣,也可以用es6的class語法實(shí)現(xiàn)Queue類,用WeakMap保存私用屬性items,并用閉包返回Queue類,來看具體實(shí)現(xiàn):
let Queue = (function () { let items = new WeakMap class Queue { constructor () { items.set(this, []) } enqueue (element) { let q = items.get(this) q.push(element) } dequeue () { let q = items.get(this) return q.shift() } front () { let q = items.get(this) return q[0] } isEmpty () { let q = items.get(this) return q.length === 0 } size () { let q = items.get(this) return q.length } print () { let q = items.get(this) console.log(q.toString()) } } return Queue })() let queue = new Queue() queue.enqueue("a") queue.enqueue("b") queue.enqueue("c") queue.dequeue() queue.print()優(yōu)先隊(duì)列
優(yōu)先隊(duì)列顧名思義就是:隊(duì)列中的每個(gè)元素都會(huì)有各自的優(yōu)先級(jí),在插入的時(shí)候會(huì)根據(jù)優(yōu)先級(jí)的高低順序進(jìn)行插入操作,和前面隊(duì)列實(shí)現(xiàn)有點(diǎn)不太一樣的地方,隊(duì)列中的元素多了有先級(jí)的屬性,下面來看具體代碼:
function PriorityQueue() { let items = [] // 隊(duì)列元素,多定義一個(gè)優(yōu)先級(jí)變量 function QueueElement(element, priority) { this.element = element this.priority = priority } this.enqueue = function (element, priority) { let queueElement = new QueueElement(element, priority) let added = false for (let i = 0; i < items.length; i++) { //數(shù)字越小優(yōu)先級(jí)越高 if (queueElement.priority < items[i].priority) { items.splice(i, 0, queueElement) added = true break } } if (!added) { items.push(queueElement) } } 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 } this.print = function () { for (let i = 0; i < items.length; i++) { console.log(`${items[i].priority}-${items[i].element}`) } } } let priorityQueue = new PriorityQueue() priorityQueue.enqueue("a", 3) priorityQueue.enqueue("b", 2) priorityQueue.enqueue("c", 1) priorityQueue.dequeue() priorityQueue.print()
入隊(duì)時(shí)如果隊(duì)列為空直接加入隊(duì)列,否則進(jìn)行比較,priority小的優(yōu)先級(jí)高,優(yōu)先級(jí)越高放在隊(duì)列的越前面,下面用一個(gè)圖來看調(diào)用過程:
循環(huán)隊(duì)列顧名思義就是:給定一個(gè)數(shù),然后迭代隊(duì)列,從隊(duì)列開頭移除一項(xiàng),然后再將其加到隊(duì)列末尾,當(dāng)循環(huán)到給定數(shù)字時(shí)跳出循環(huán),從隊(duì)首移除一項(xiàng),直至剩余一個(gè)元素,下面來看具體代碼:
unction Queue() { let items = [] 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 } this.print = function () { console.log(items.toString()) } } function loopQueue(list, num) { let queue = new Queue() for (let i = 0; i1) { for (let j = 0; j 總結(jié) 這篇文章主要對(duì)隊(duì)列做了簡(jiǎn)單介紹,對(duì)隊(duì)列以及相關(guān)應(yīng)用做了簡(jiǎn)單實(shí)現(xiàn)。如果有錯(cuò)誤或不嚴(yán)謹(jǐn)?shù)牡胤剑瑲g迎批評(píng)指正,如果喜歡,歡迎點(diǎn)贊。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/101627.html
摘要:我對(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ì)列的末尾。...
摘要:使用關(guān)鍵字來表示,在函數(shù)內(nèi)部使用來表示異步。執(zhí)行完了后,執(zhí)行棧再次為空,事件觸發(fā)線程會(huì)重復(fù)上一步操作,再取出一個(gè)消息隊(duì)列中的任務(wù),這種機(jī)制就被稱為事件循環(huán)機(jī)制。 async 函數(shù)是 Generator 函數(shù)的語法糖。使用 關(guān)鍵字 async 來表示,在函數(shù)內(nèi)部使用 await 來表示異步。想較于 Generator,Async 函數(shù)的改進(jìn)在于下面四點(diǎn): 內(nèi)置執(zhí)行器 Generato...
摘要:這道的面試題,是這樣的,頁(yè)面上有一個(gè)按鈕,一個(gè),點(diǎn)擊按鈕的時(shí)候,每隔秒鐘向的后面追加一個(gè)一共追加個(gè),的內(nèi)容從開始技術(shù),首先我們用閉包封裝一個(gè)創(chuàng)建元素的函數(shù)頁(yè)面上的個(gè)元素點(diǎn)我代碼點(diǎn)擊按鈕的時(shí)候,用回調(diào)函數(shù)嵌套方式,這里我加入個(gè),就已經(jīng)快受不了 這道js的面試題,是這樣的,頁(yè)面上有一個(gè)按鈕,一個(gè)ul,點(diǎn)擊按鈕的時(shí)候,每隔1秒鐘向ul的后面追加一個(gè)li, 一共追加10個(gè),li的內(nèi)容從0開始技...
摘要:下一篇數(shù)據(jù)結(jié)構(gòu)與算法鏈表寫在前面說明數(shù)據(jù)結(jié)構(gòu)與算法系列文章的代碼和示例均可在此找到原計(jì)劃是把你不知道的三部全部看完的,偶然間朋友推薦了數(shù)據(jù)結(jié)構(gòu)與算法的一套入門視頻,學(xué)之。手頭上恰好有學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法的書籍,便轉(zhuǎn)而先把數(shù)據(jù)結(jié)構(gòu)與算法學(xué)習(xí)。 下一篇:JS數(shù)據(jù)結(jié)構(gòu)與算法_鏈表 寫在前面 說明:JS數(shù)據(jù)結(jié)構(gòu)與算法 系列文章的代碼和示例均可在此找到 原計(jì)劃是把《你不知道的Javascript》...
摘要:引擎線程也稱為內(nèi)核,負(fù)責(zé)處理腳本程序例如引擎引擎線程負(fù)責(zé)解析腳本,運(yùn)行代碼。對(duì)象代表一個(gè)未完成但預(yù)計(jì)將來會(huì)完成的操作。注意一旦新建就會(huì)立即執(zhí)行它屬于,無法取消。 寫在前面: 第一遍學(xué)Promise時(shí), 只是大概過了一遍, 感覺學(xué)的不夠深入, 這一篇算是對(duì)之前的一個(gè)總結(jié)吧. Promise在ES6中也屬于一個(gè)較難理解的一部分; 所以在學(xué)習(xí)一個(gè)比較難理解的知識(shí)點(diǎn)時(shí), 我們可以圍繞這個(gè)知識(shí)點(diǎn)...
閱讀 2683·2021-11-18 10:02
閱讀 3415·2021-09-28 09:35
閱讀 2594·2021-09-22 15:12
閱讀 753·2021-09-22 15:08
閱讀 3110·2021-09-07 09:58
閱讀 3475·2021-08-23 09:42
閱讀 735·2019-08-30 12:53
閱讀 2085·2019-08-29 13:51