JavaScript隊(duì)列的應(yīng)用實(shí)例詳解【經(jīng)典數(shù)據(jù)結(jié)構(gòu)】
本文實(shí)例講述了JavaScript隊(duì)列的應(yīng)用。分享給大家供大家參考,具體如下:
和前面介紹的棧相反,隊(duì)列是一種先進(jìn)先出的線性表,它只允許在表的一端進(jìn)行插入,而在另一端進(jìn)行刪除。JavaScript自己提供了兩個(gè)隊(duì)列方法shift
和push
方法,分別是出隊(duì)和入隊(duì),其原理就是將元素插入數(shù)組最后一個(gè)和刪除第一個(gè)元素。
這里需要注意一點(diǎn),就是unshift方法的效率比push的效率要低很多。因?yàn)樗獙⑷腙?duì)之前的數(shù)組全部往前移動(dòng)一位。這里我們就不用代碼再次演示了。
和線性表類似,隊(duì)列也分為順序隊(duì)列和鏈隊(duì)列。
和順序棧類似,在隊(duì)列的順序存儲(chǔ)結(jié)構(gòu)中,除了使用一組地址連續(xù)的存儲(chǔ)單元依次存放從隊(duì)列頭到隊(duì)列尾的元素之外,還要設(shè)置兩個(gè)指針front
和rear
分別指向隊(duì)列頭元素和隊(duì)列尾元素。初始化時(shí),front=rear=0
;插入元素時(shí),rear+1
;刪除元素時(shí),front+1
。所以在非空隊(duì)列中,頭指針始終指向隊(duì)列頭元素,而尾指針始終指向隊(duì)列尾元素的下一個(gè)位置。
隊(duì)列的應(yīng)用有哪些呢?
我們先看看計(jì)算機(jī)組成層面的吧,首先就是CPU資源的競(jìng)爭(zhēng)問(wèn)題。在具有多個(gè)終端的計(jì)算機(jī)系統(tǒng)中,有多個(gè)用戶需要使用CPU來(lái)各自運(yùn)行程序,操作系統(tǒng)會(huì)按照每個(gè)請(qǐng)求在時(shí)間上的順序,加請(qǐng)求排成一個(gè)隊(duì)列。每次把CPU分配給隊(duì)頭的任務(wù),完成后使其出隊(duì),然后依次。
第二個(gè)例子就是主機(jī)與外部設(shè)備之間速度不匹配的問(wèn)題。我們以打印機(jī)和主機(jī)為例。主機(jī)輸出數(shù)據(jù)給打印機(jī)打印,主機(jī)輸出數(shù)據(jù)的速度遠(yuǎn)大于打印機(jī)打印速度,所以有一個(gè)打印數(shù)據(jù)緩沖區(qū),主要把數(shù)據(jù)依次寫入緩沖區(qū),寫滿后主機(jī)就暫停輸出,繼而去做其他時(shí)間,只到打印機(jī)完成打印,再次請(qǐng)求主機(jī)發(fā)送數(shù)據(jù),主機(jī)才繼續(xù)輸出數(shù)據(jù)。這樣利用隊(duì)列可以提高主機(jī)的效率。
我在這里挑一個(gè)常見的軟件層面的例子,也就是銀行排隊(duì)問(wèn)題。先說(shuō)說(shuō)實(shí)現(xiàn)思路,第一個(gè)客戶到達(dá)的時(shí)刻為0,之后每個(gè)客戶到達(dá)的時(shí)刻在前一個(gè)客戶到達(dá)時(shí)設(shè)定隨機(jī)值,因此在客戶到達(dá)時(shí)需要產(chǎn)生兩個(gè)隨機(jī)數(shù),一個(gè)是客戶辦理業(yè)務(wù)耗時(shí)durtime,一個(gè)是下一客戶到達(dá)時(shí)間間隔intertime,假設(shè)當(dāng)前時(shí)間為occurtime,則下一客戶到達(dá)時(shí)為occurtime+intertime。
剛到達(dá)的客戶應(yīng)該插入到當(dāng)前含元素最少的隊(duì)列中。
在JavaScript的運(yùn)用中,通常使用隊(duì)列來(lái)進(jìn)行任務(wù)的排序。而任務(wù)隊(duì)列的任務(wù)是按進(jìn)入隊(duì)列的順序延遲執(zhí)行(解決狀態(tài)一致性)的,即當(dāng)前一個(gè)任務(wù)完成后,后面的任務(wù)才被執(zhí)行,如果當(dāng)前沒(méi)有任務(wù),則入隊(duì)列的任務(wù)立即執(zhí)行。代碼如下:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>隊(duì)列</title> </head> <body> <script type="text/javascript"> function taskQueue() { taskList = []; var isRun = false; this.addTask = function (task) { taskList.push(task); }; setInterval(function () { if (taskList.length > 0 && !isRun) { isRun = true; taskList.shift(); isRun = false; } }, 100); } function show(){ alert(taskList); } taskQueue(); addTask(1); addTask(2); addTask(3); setTimeout('show()',99);//1,2,3 setTimeout('show()',101);//2,3 setTimeout('show()',400);//null </script> </body> </html>
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》、《JavaScript排序算法總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》、《JavaScript查找算法技巧總結(jié)》及《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》
希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。
- JS中的算法與數(shù)據(jù)結(jié)構(gòu)之隊(duì)列(Queue)實(shí)例詳解
- JavaScript數(shù)據(jù)結(jié)構(gòu)與算法之隊(duì)列原理與用法實(shí)例詳解
- JavaScript數(shù)據(jù)結(jié)構(gòu)之優(yōu)先隊(duì)列與循環(huán)隊(duì)列實(shí)例詳解
- JavaScript數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)之?dāng)?shù)組、棧與隊(duì)列
- JavaScript數(shù)組實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)中的隊(duì)列與堆棧
- JavaScript數(shù)據(jù)結(jié)構(gòu)與算法之棧與隊(duì)列
- JavaScript中數(shù)據(jù)結(jié)構(gòu)與算法(二):隊(duì)列
- 基于JavaScript的數(shù)據(jù)結(jié)構(gòu)隊(duì)列動(dòng)畫實(shí)現(xiàn)示例解析
相關(guān)文章
Mock.js的安裝與使用教程(擺脫后端同學(xué)的束縛)
Mock功能可以根據(jù)接口/數(shù)據(jù)結(jié)構(gòu)定義、Mock規(guī)則配置、Mock?期望配置,自動(dòng)生成模擬數(shù)據(jù),且使用者可以根據(jù)需要靈活構(gòu)造各種結(jié)構(gòu)的接口數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于Mock.js的安裝與使用的相關(guān)資料,需要的朋友可以參考下2022-08-08解決js相同的正則多次調(diào)用test()返回的值卻不同的問(wèn)題
今天小編就為大家分享一篇解決js相同的正則多次調(diào)用test()返回的值卻不同的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-10-10對(duì)javascript的一點(diǎn)點(diǎn)認(rèn)識(shí)總結(jié)《javascript高級(jí)程序設(shè)計(jì)》讀書筆記
Javascript專為與網(wǎng)頁(yè)交互而設(shè)計(jì)的腳本語(yǔ)言,由下列三個(gè)部門構(gòu)造2011-11-11javascript實(shí)現(xiàn)tabs選項(xiàng)卡切換效果(擴(kuò)展版)
常用的頁(yè)面效果有彈出層效果,無(wú)縫滾動(dòng)效果,選項(xiàng)卡切換效果,接下來(lái)與大家分享一款自己用原生javascript寫的選項(xiàng)卡切換效果在原有的基礎(chǔ)上進(jìn)行了擴(kuò)展,加入了自動(dòng)輪播,這樣就變成了類似圖片輪播的效果2013-03-03讓firefox支持IE的一些方法的javascript擴(kuò)展函數(shù)代碼
因?yàn)橐恍┐a,只能在IE下實(shí)現(xiàn),如果用firefox實(shí)現(xiàn)就必須用一些擴(kuò)展函數(shù)。2010-01-01處理Axios返回Promise對(duì)象的幾種常見方式
Axios返回的是Promise對(duì)象,這意味著可以使用Promise的.then()、.catch()和.finally()方法來(lái)處理異步操作的結(jié)果,本文詳細(xì)介紹了處理Axios返回Promise對(duì)象的幾種常見方式,需要的朋友可以參考下2024-09-09javascript實(shí)現(xiàn)捕捉鍵盤上按下的鍵
JavaScript取得按下鍵盤的鍵是哪個(gè),通過(guò)創(chuàng)建一個(gè)event.keyCode對(duì)象,可有效獲取鍵盤上的鍵,運(yùn)行代碼后,點(diǎn)擊鍵盤上的任意鍵,網(wǎng)頁(yè)上顯示你按下的是哪個(gè)鍵。2015-05-05簡(jiǎn)單了解JavaScript中的執(zhí)行上下文和堆棧
這篇文章主要介紹了簡(jiǎn)單了解JavaScript中的執(zhí)行上下文和堆棧,你應(yīng)該對(duì)解釋器了解得更清楚:為什么在聲明它們之前可以使用某些函數(shù)或變量?以及它們的值是如何確定的?,需要的朋友可以參考下2019-06-06