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自己提供了兩個隊(duì)列方法shift和push方法,分別是出隊(duì)和入隊(duì),其原理就是將元素插入數(shù)組最后一個和刪除第一個元素。
這里需要注意一點(diǎn),就是unshift方法的效率比push的效率要低很多。因?yàn)樗獙⑷腙?duì)之前的數(shù)組全部往前移動一位。這里我們就不用代碼再次演示了。
和線性表類似,隊(duì)列也分為順序隊(duì)列和鏈隊(duì)列。
和順序棧類似,在隊(duì)列的順序存儲結(jié)構(gòu)中,除了使用一組地址連續(xù)的存儲單元依次存放從隊(duì)列頭到隊(duì)列尾的元素之外,還要設(shè)置兩個指針front和rear分別指向隊(duì)列頭元素和隊(duì)列尾元素。初始化時,front=rear=0;插入元素時,rear+1;刪除元素時,front+1。所以在非空隊(duì)列中,頭指針始終指向隊(duì)列頭元素,而尾指針始終指向隊(duì)列尾元素的下一個位置。
隊(duì)列的應(yīng)用有哪些呢?
我們先看看計算機(jī)組成層面的吧,首先就是CPU資源的競爭問題。在具有多個終端的計算機(jī)系統(tǒng)中,有多個用戶需要使用CPU來各自運(yùn)行程序,操作系統(tǒng)會按照每個請求在時間上的順序,加請求排成一個隊(duì)列。每次把CPU分配給隊(duì)頭的任務(wù),完成后使其出隊(duì),然后依次。
第二個例子就是主機(jī)與外部設(shè)備之間速度不匹配的問題。我們以打印機(jī)和主機(jī)為例。主機(jī)輸出數(shù)據(jù)給打印機(jī)打印,主機(jī)輸出數(shù)據(jù)的速度遠(yuǎn)大于打印機(jī)打印速度,所以有一個打印數(shù)據(jù)緩沖區(qū),主要把數(shù)據(jù)依次寫入緩沖區(qū),寫滿后主機(jī)就暫停輸出,繼而去做其他時間,只到打印機(jī)完成打印,再次請求主機(jī)發(fā)送數(shù)據(jù),主機(jī)才繼續(xù)輸出數(shù)據(jù)。這樣利用隊(duì)列可以提高主機(jī)的效率。
我在這里挑一個常見的軟件層面的例子,也就是銀行排隊(duì)問題。先說說實(shí)現(xiàn)思路,第一個客戶到達(dá)的時刻為0,之后每個客戶到達(dá)的時刻在前一個客戶到達(dá)時設(shè)定隨機(jī)值,因此在客戶到達(dá)時需要產(chǎn)生兩個隨機(jī)數(shù),一個是客戶辦理業(yè)務(wù)耗時durtime,一個是下一客戶到達(dá)時間間隔intertime,假設(shè)當(dāng)前時間為occurtime,則下一客戶到達(dá)時為occurtime+intertime。
剛到達(dá)的客戶應(yīng)該插入到當(dāng)前含元素最少的隊(duì)列中。
在JavaScript的運(yùn)用中,通常使用隊(duì)列來進(jìn)行任務(wù)的排序。而任務(wù)隊(duì)列的任務(wù)是按進(jìn)入隊(duì)列的順序延遲執(zhí)行(解決狀態(tài)一致性)的,即當(dāng)前一個任務(wù)完成后,后面的任務(wù)才被執(zhí)行,如果當(dāng)前沒有任務(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錯誤與調(diào)試技巧總結(jié)》
希望本文所述對大家JavaScript程序設(shè)計有所幫助。
- 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ì)列動畫實(shí)現(xiàn)示例解析
相關(guān)文章
echartjs實(shí)現(xiàn)cross十星輔助線實(shí)現(xiàn)示例詳解
這篇文章主要為大家介紹了echartjs實(shí)現(xiàn)cross十星輔助線實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
javascript實(shí)現(xiàn)簡單的進(jìn)度條
本文給大家分享2個javascript實(shí)現(xiàn)簡單的進(jìn)度條,一個是個人制作一個是網(wǎng)友實(shí)現(xiàn)的,都很不錯,這里推薦給大家。2015-07-07
微信小程序云開發(fā)實(shí)現(xiàn)分頁刷新獲取數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了微信小程序云開發(fā)實(shí)現(xiàn)分頁刷新獲取數(shù)據(jù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-08-08
js+css實(shí)現(xiàn)回到頂部按鈕(back to top)
這篇文章主要為大家詳細(xì)介紹了js+css實(shí)現(xiàn)回到頂部按鈕back to top回到頂部按鈕,感興趣的小伙伴們可以參考一下2016-03-03
javascript實(shí)現(xiàn)Email郵件顯示與刪除功能
這篇文章主要介紹了javascript實(shí)現(xiàn)Email郵件顯示與刪除功能,需要的朋友可以參考下2015-11-11
js實(shí)現(xiàn)canvas圖片與img圖片的相互轉(zhuǎn)換的示例
本篇文章主要介紹了js實(shí)現(xiàn)canvas圖片與img圖片的相互轉(zhuǎn)換的示例,具有一定的參考價值,有興趣的可以了解一下2017-08-08
JavaScript實(shí)現(xiàn)頁面跳轉(zhuǎn)的5種方法總結(jié)
在前臺開發(fā)中會涉及頁面跳轉(zhuǎn)的問題,下面這篇文章主要給大家總結(jié)介紹了關(guān)于JavaScript實(shí)現(xiàn)頁面跳轉(zhuǎn)的5種方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12

