摘要:而且目前大部分編程語言的高級應(yīng)用都會(huì)用到數(shù)據(jù)結(jié)構(gòu)與算法以及設(shè)計(jì)模式。隊(duì)列在尾部添加新元素,并從頂部移除元素。最新添加的元素必須排在隊(duì)列的末尾。
前言
JavaScript是當(dāng)下最流行的編程語言之一,它可以做很多事情:
數(shù)據(jù)可視化(D3.js,Three.js,Chart.js);
移動(dòng)端應(yīng)用(React Native,Weex,AppCan,Flutter,Hybrid App,小程序);
服務(wù)端(Express.js,Koa2);
桌面應(yīng)用(Electron,nw.js);
游戲,VR,AR(LayaAir,Egret,Turbulenz,PlayCanvas);
等等。。。
而且目前大部分編程語言的高級應(yīng)用都會(huì)用到數(shù)據(jù)結(jié)構(gòu)與算法以及設(shè)計(jì)模式。
本篇主要有三部分什么是隊(duì)列
隊(duì)列的實(shí)現(xiàn)
隊(duì)列的變種
什么是隊(duì)列 較官方解釋隊(duì)列是遵循FIFO(First In First Out,先進(jìn)先出,也稱為先來先服務(wù))原則的一組有序的項(xiàng)。
隊(duì)列在尾部添加新元素,并從頂部移除元素。最新添加的元素必須排在隊(duì)列的末尾 。
注:出隊(duì)入隊(duì)是自己加的,不知道是不是這么叫
我看有很多文檔都是說隊(duì)列就像買什么東西排隊(duì),我認(rèn)為這個(gè)比喻用在標(biāo)準(zhǔn)隊(duì)列上不恰當(dāng)。
我覺得標(biāo)準(zhǔn)隊(duì)列像是一段管道,每次都只能放一個(gè)球進(jìn)去,上邊只用來放球(入隊(duì)),由于地球引力,球會(huì)從下邊的口出去(出隊(duì))。
隊(duì)列:這段可以放球的管道就是隊(duì)列
元素:管道里的球
隊(duì)首:在當(dāng)前管道里的球最早放進(jìn)去的那個(gè)球的位置,同時(shí)也是第一個(gè)掉出去的球
隊(duì)尾:在當(dāng)前管道里的球最后放進(jìn)去的那個(gè)球的位置,同時(shí)也是最后一個(gè)掉出去的球
添加隊(duì)列成員
刪除隊(duì)列成員
返回隊(duì)首的成員
隊(duì)列是否為空
清空隊(duì)列
隊(duì)列長度
返回字符串形式的隊(duì)列成員
class Queue { constructor() { this.count = 0; // 整個(gè)隊(duì)列下一成員的位置 this.lowestCount = 0; // 在第一位的成員位置 this.items = {}; // 用來存放的隊(duì)列 } enqueue(element) { // 添加隊(duì)列成員 進(jìn)入隊(duì)列 } dequeue() { // 刪除隊(duì)列成員 離開隊(duì)列 } peek() { // 返回隊(duì)首的成員 } isEmpty() { // 判斷隊(duì)列是否為空 } clear() { // 將所有的數(shù)據(jù)初始化 } size() { // 隊(duì)列長度 } toString() { // 返回字符串形式的隊(duì)列成員 } }添加隊(duì)列成員
enqueue(element) { this.items[this.count] = element; // 將元素放入隊(duì)列 this.count++; // 將計(jì)數(shù)器加一 }刪除隊(duì)列成員
dequeue() { if (this.isEmpty()) { // 如果是空 return undefined; // 返回未定義 undefined } const result = this.items[this.lowestCount]; // 將隊(duì)首的成員保存下 delete this.items[this.lowestCount]; // 將隊(duì)首的成員刪除掉 刪除對象屬性 this.lowestCount++; // 將隊(duì)列提前一位 指向隊(duì)首的指針后移一位 return result; // 返回被刪除的成員 }返回隊(duì)首的成員
peek() { if (this.isEmpty()) { // 非空才能繼續(xù)處理 return undefined; } return this.items[this.lowestCount]; }隊(duì)列是否為空
isEmpty() { // 判斷長度是不是 0 return this.size() === 0; }清空隊(duì)列
clear() { this.count = 0; // 恢復(fù)初始值 this.lowestCount = 0; // 恢復(fù)初始值 this.items = {}; // 重新賦值空對象 }隊(duì)列長度
size() { // 隊(duì)列長度 等于 整個(gè)隊(duì)列下一成員的位置 減去 在第一位的成員位置 return this.count - this.lowestCount; }返回字符串形式的隊(duì)列成員
toString() { if (this.isEmpty()) { return ""; } let objString = `${this.items[this.lowestCount]}`; for (let i = this.lowestCount + 1; i < this.count; i++) { objString = `${objString},${this.items[i]}`; } return objString; }隊(duì)列的變種
優(yōu)先隊(duì)列
類似去醫(yī)院看病,急診,會(huì)優(yōu)先一般的門診
循環(huán)隊(duì)列
類似搶凳子游戲,隊(duì)列首位相連
優(yōu)先隊(duì)列在添加成員時(shí)會(huì)判斷優(yōu)先級,
class QueueElement (element, priority){ // 隊(duì)列成員類 this.element = element; // 存放成員 this.priority = priority; // 存放優(yōu)先級 } enqueue(element, priority){ let queueElement = new QueueElement(element, priority); // 添加成員 let added = false; // 是否已添加到隊(duì)列 for (let i = 0; i < this.size(); i++){ // 遍歷隊(duì)列 if (queueElement.priority < items[i].priority){ // 尋找優(yōu)先級低的成員,并插入到其之前 // splice start for(let j = this.size(); j > i; j--){ items[j] = items[j-1]; } items[i] = queueElement; // splice end added = true; // 標(biāo)識(shí)符置為真,表示已經(jīng)添加 break; // 跳出循環(huán) } } if (!added){ // 如果沒有找到優(yōu)先級比新添加的成員低的,那么將其添加到隊(duì)尾 items.push(queueElement); } };循環(huán)隊(duì)列
在操作時(shí)每刪除一個(gè)隊(duì)列成員就將刪除的這個(gè)隊(duì)列成員重新添加到隊(duì)列中
for (let i = 0; i < number; i++){ queue.enqueue(queue.dequeue()); }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/101492.html
摘要:之?dāng)?shù)組操作接下來就是數(shù)據(jù)結(jié)構(gòu)的第一部分,棧。以字符串顯示棧中所有內(nèi)容方法的實(shí)現(xiàn)說明需要往棧中添加新元素,元素位置在隊(duì)列的末尾。的前端樂園原文鏈接寒假前端學(xué)習(xí)學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法,棧與隊(duì)列 本系列的第一篇文章: 學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法(一),棧與隊(duì)列第二篇文章:學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法(二):鏈表第三篇文章:學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法(三):集合第...
摘要:簡介隊(duì)列遵循的是先進(jìn)先出的原則的一組有序的項(xiàng)。隊(duì)列從尾部添加新元素,并從頂部移除元素,最新添加的元素必須排列在隊(duì)列的末尾。它的想法來自于生活中排隊(duì)的策略。隊(duì)列不做任何變動(dòng)。 簡介 隊(duì)列遵循的是FIFO(先進(jìn)先出)的原則的一組有序的項(xiàng)。 隊(duì)列從尾部添加新元素,并從頂部移除元素,最新添加的元素必須排列在隊(duì)列的末尾。 它的想法來自于生活中排隊(duì)的策略。顧客在付款結(jié)賬的時(shí)候,按照到來的先后順序排...
摘要:隊(duì)列數(shù)據(jù)結(jié)構(gòu)隊(duì)列遵循先進(jìn)先出,也稱先來先服務(wù)原則的一組有序的項(xiàng)。隊(duì)列在尾部添加新元素,并從頂部移除元素。最新添加的元素必須排在隊(duì)列的的末尾。 隊(duì)列和棧非常類似,但是使用了不同的原則,而非后進(jìn)先出,是先進(jìn)先出。 1.隊(duì)列數(shù)據(jù)結(jié)構(gòu) 隊(duì)列遵循FIFO(先進(jìn)先出,也稱先來先服務(wù))原則的一組有序的項(xiàng)。隊(duì)列在尾部添加新元素,并從頂部移除元素。最新添加的元素必須排在隊(duì)列的的末尾。隊(duì)列示意圖如下: s...
摘要:隊(duì)列遵循原則的一組有序的項(xiàng)向隊(duì)列尾部添加一個(gè)項(xiàng)移除隊(duì)列的第一項(xiàng)返回隊(duì)列中第一項(xiàng),對隊(duì)列本身不做修改判斷隊(duì)列是否為空返回隊(duì)列包含的元素個(gè)數(shù)優(yōu)先隊(duì)列根據(jù)優(yōu)先級添加項(xiàng)最小優(yōu)先隊(duì)列移除隊(duì)列的第一項(xiàng)返回隊(duì)列中第一項(xiàng),對隊(duì)列本身不做修改判斷隊(duì)列是否 隊(duì)列遵循FIFO(First In First Out)原則的一組有序的項(xiàng) let Queue = (function () { let it...
摘要:于是翻出了機(jī)房里的這本學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法開始學(xué)習(xí)程序員的基礎(chǔ)知識(shí)。這本書用了我最熟悉的來實(shí)現(xiàn)各種數(shù)據(jù)結(jié)構(gòu)和算法,而且書很薄,可以說是一本不錯(cuò)的入門教程。隊(duì)列在頭部刪除元素,尾部添加元素。 本系列所有文章:第一篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之棧與隊(duì)列第二篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之鏈表第三篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之集合第四篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之字典和散列表第五篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算...
閱讀 3304·2021-11-22 12:07
閱讀 1971·2021-10-12 10:11
閱讀 1099·2019-08-30 15:44
閱讀 3004·2019-08-30 12:45
閱讀 2302·2019-08-29 16:41
閱讀 1688·2019-08-29 16:35
閱讀 2718·2019-08-29 12:57
閱讀 1214·2019-08-26 13:51