国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

JavaScript數據結構與算法之隊列原理與用法實例詳解

來源:懂視網 責編:小采 時間:2020-11-27 22:25:09
文檔

JavaScript數據結構與算法之隊列原理與用法實例詳解

JavaScript數據結構與算法之隊列原理與用法實例詳解:本文實例講述了JavaScript數據結構與算法之隊列原理與用法。分享給大家供大家參考,具體如下: 隊列是一種列表,不同的是隊列只能在隊尾插入元素,在隊首刪除元素。隊列用于存儲按順序排列的數據,先進先出,這點和棧不一樣(后入先出)。在棧中,最后入棧的元
推薦度:
導讀JavaScript數據結構與算法之隊列原理與用法實例詳解:本文實例講述了JavaScript數據結構與算法之隊列原理與用法。分享給大家供大家參考,具體如下: 隊列是一種列表,不同的是隊列只能在隊尾插入元素,在隊首刪除元素。隊列用于存儲按順序排列的數據,先進先出,這點和棧不一樣(后入先出)。在棧中,最后入棧的元

本文實例講述了JavaScript數據結構與算法之隊列原理與用法。分享給大家供大家參考,具體如下:

隊列是一種列表,不同的是隊列只能在隊尾插入元素,在隊首刪除元素。隊列用于存儲按順序排列的數據,先進先出,這點和棧不一樣(后入先出)。在棧中,最后入棧的元素反而被優先處理。我們現在可以把隊列想象對我們去餐館吃飯的情景,很多人排隊吃飯,排在最前面的人先打飯。新來的人只能在后面排隊。直到輪到他們為止。

一:對隊列的操作

隊列有2種主要的操作,向隊尾中插入新元素enqueue()方法和刪除隊列中的隊首的元素的dequeue()方法,另外我們還有一個讀取隊頭的元素,這個方法我們可以叫front()方法。該方法返回隊頭元素等等方法。

看到如上描述,我們很多人可能會想到數組,數組里面也有2個方法和上面的方法功能類似,數組中push()方法也是往數組后面加入新元素,數組中shift()方法則可以刪除數組里面的第一個元素。如下代碼:

var arrs = [];
arrs.push("a");
arrs.push("b");
console.log(arrs); // ["a","b"];
arrs.shift();
console.log(arrs); // ['b'];

下面我們可以使用上面的數組中的push()shift()的2個方法來封裝我們的隊列Queue類;

1.  我們可以先定義一個構造函數Queue類,如下:

function Queue() {
 this.dataStore = [];
}

如上:this.dataStore = []; 空數組時存儲隊列中所有的元素的。

2. 向隊尾中添加一個元素方法如下:

function enqueue(element) {
 this.dataStore.push(element);
}

3. 刪除隊首的元素如下:

function dequeue() {
 return this.dataStore.shift()
}

4. 讀取隊首的元素如下:

function front() {
 return this.dataStore[0];
}

5. 讀取隊尾的元素如下:

function back() {
 return this.dataStore[this.dataStore.length - 1];
}

6. 顯示隊列中的所有元素

function toString() {
 var retStr = "";
 for(var i = 0; i < this.dataStore.length; ++i) {
 retStr += this.dataStore[i] + "\n";
 }
 return retStr;
}

7. 判斷隊列是否為空如下:

function empty(){
 if(this.dataStore.length == 0) {
 return true;
 }else {
 return false;
 }
}

下面是完整的JS代碼如下:

function Queue() {
 this.dataStore = [];
}
Queue.prototype = {
 // 向隊尾添加一個元素
 enqueue: function(element) {
 this.dataStore.push(element);
 },
 // 刪除隊首的元素
 dequeue: function(){
 return this.dataStore.shift();
 },
 // 讀取隊首的元素
 front: function(){
 return this.dataStore[0];
 },
 // 讀取隊尾的元素
 back: function(){
 return this.dataStore[this.dataStore.length - 1];
 },
 // 顯示隊列內的所有元素
 toString: function(){
 var retStr = "";
 for(var i = 0; i < this.dataStore.length; ++i) {
 retStr += this.dataStore[i] + "\n";
 }
 return retStr;
 },
 // 判斷隊列是否為空
 empty: function(){
 if(this.dataStore.length == 0) {
 return true;
 }else {
 return false;
 }
 }
};

我們現在可以對以上代碼測試下:如下:

var q = new Queue();
q.enqueue("a");
q.enqueue("b");
q.enqueue("c");
console.log(q.toString()); // a b c
q.dequeue();
console.log(q.toString()); // b c
console.log("Front of queue:" +q.front()); // b
console.log("Back of queue:" +q.back()); // c

二:使用隊列對數據進行排序

比如對于 0 ~ 99 的數字進行排序,原理是:先對個位上的數字進行排序一次,然后對十位上的數字再進行排序一次。每個數字根據對應位上的數值被分在不同的盒子里面,然后對于個位上的數字采用除余數的方法,對于10位上的數字采用除法的方法,那么這種排序叫做 “基數排序”. 但是它不是最快的排序方法,但是它描述了一些有趣的隊列使用方法。

比如如下數組:

var nums = ["50","12","95","7","90","3","74","81","91","72"];

1. 經過基數排序--個位排序后,數字被分配在不同的盒子里面。(在JS里面,我們可以分配在不同的隊列Queue實例類里面)。如下

queues[0] = 50 或者 90
queues[1] = 81 或者 91
queues[2] = 12 或者 72
queues[3] = 3
queues[4] = 74
queues[5] = 95
queues[6] 
queues[7] = 7
queues[8]
queues[9]

根據盒子的順序,對數字第一次個位排序后結果如下:

nums = [50,90,81,91,12,72,3,74,95,7]

2. 然后根據十位上的數值再將上次排序后的結果分配到不同的盒子中。如下:

queues[5] = 50
queues[9] = 90
queues[8] = 81
queues[9] = 91
queues[1] = 12
queues[7] = 72
queues[0] = 3
queues[7] = 74
queues[9] = 95
queues[0] = 7

最后,將盒子中的數字取出,組成一個新的列表,該列表即為排序好的數字。如下:

即可生成如下:

nums = [3,7,12,50,72,74,81,90,91,95];

如上使用隊列列表盒子,可以實現這個算法,我們需要10個隊列,每個隊列對應一個數字,將所有隊列保存在一個數組中,使用取余和除法操作決定個位和十位。算法的剩余部分將數字加入相應的隊列,根據個位數值進行重新排序,然后再根據十位上的數值進行排序,結果加入排序好的數字。

下面根據個位或十位上的數值,將數字分配到相應隊列的函數。

/*
* 根據個位或十位上的數值,將數字分配到相應隊列的函數
* @param digit
* digit=1 表示先按個位來分配
* digit = 10 表示是按十位來分配的
* @param n 表示循環比較多少次 一般數組幾個數字就比較多少次
*/
distribute: function(nums,queues,n,digit){
 for(var i = 0; i < n; ++i) {
 if(digit == 1) {
 queues[nums[i] % 10].enqueue(nums[i]);
 }else {
 queues[Math.floor(nums[i] / 10)].enqueue(nums[i]);
 }
 }
}

下面是從隊列中收集數字的函數如下:

// 收集數字的函數
collect: function(queues,nums,n) {
 var i = 0;
 for(var digit = 0; digit < n; ++digit) {
 while(!queues[digit].empty()) {
 nums[i++] = queues[digit].dequeue();
 }
 }
}

由于上面省略了很多步驟,可能描述的不是很清楚,我們現在先來看看流程圖,結合流程圖,最后結合JS的所有代碼就可以理解"基數排序的"基本原理了;下面我們可以看看如下的流程圖;

最后是所有的JS代碼如下:

function Queue() {
 this.dataStore = [];
}
Queue.prototype = {
 // 向隊尾添加一個元素
 enqueue: function(element) {
 this.dataStore.push(element);
 },
 // 刪除隊首的元素
 dequeue: function(){
 return this.dataStore.shift();
 },
 // 讀取隊首的元素
 front: function(){
 return this.dataStore[0];
 },
 // 讀取隊尾的元素
 back: function(){
 return this.dataStore[this.dataStore.length - 1];
 },
 // 顯示隊列內的所有元素
 toString: function(){
 var retStr = "";
 for(var i = 0; i < this.dataStore.length; ++i) {
 retStr += this.dataStore[i] + "\n";
 }
 return retStr;
 },
 // 判斷隊列是否為空
 empty: function(){
 if(this.dataStore.length == 0) {
 return true;
 }else {
 return false;
 }
 },
 /*
 * 根據個位或十位上的數值,將數字分配到相應隊列的函數
 * @param digit
 * digit=1 表示先按個位來分配
 * digit = 10 表示是按十位來分配的
 * @param n 表示循環比較多少次 一般數組幾個數字就比較多少次
 */
 distribute: function(nums,queues,n,digit){
 for(var i = 0; i < n; ++i) {
 if(digit == 1) {
 queues[nums[i] % 10].enqueue(nums[i]);
 }else {
 queues[Math.floor(nums[i] / 10)].enqueue(nums[i]);
 }
 }
 },
 // 收集數字的函數
 collect: function(queues,nums,n) {
 var i = 0;
 for(var digit = 0; digit < n; ++digit) {
 while(!queues[digit].empty()) {
 nums[i++] = queues[digit].dequeue();
 }
 }
 },
 dispArray: function(arr) {
 for(var i = 0; i < arr.length; ++i) {
 console.log(arr[i]);
 }
 }
};

下面的是對 "基數排序的" JS代碼進行測試;如下代碼:

var q = new Queue();
 q.enqueue("a");
 q.enqueue("b");
 q.enqueue("c");
console.log(q.toString());
q.dequeue();
console.log(q.toString());
console.log("Front of queue:" +q.front());
console.log("Back of queue:" +q.back());
var queues = [];
for(var i = 0; i < 10; ++i) {
 queues[i] = new Queue();
}
var nums = ["50","12","95","7","90","3","74","81","91","72"];
console.log("before radix sort: ");
console.log(nums);
q.distribute(nums,queues,10,1);
q.collect(queues,nums,10);
q.dispArray(nums);
console.log("分割線");
q.distribute(nums,queues,10,10);
q.collect(queues,nums,10);
q.dispArray(nums);

如上測試代碼 大家可以運行下 就可以看到排序后的效果!

更多關于JavaScript相關內容感興趣的讀者可查看本站專題:《JavaScript數據結構與算法技巧總結》、《JavaScript數學運算用法總結》、《JavaScript排序算法總結》、《JavaScript遍歷算法與技巧總結》、《JavaScript查找算法技巧總結》及《JavaScript錯誤與調試技巧總結》

希望本文所述對大家JavaScript程序設計有所幫助。

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

JavaScript數據結構與算法之隊列原理與用法實例詳解

JavaScript數據結構與算法之隊列原理與用法實例詳解:本文實例講述了JavaScript數據結構與算法之隊列原理與用法。分享給大家供大家參考,具體如下: 隊列是一種列表,不同的是隊列只能在隊尾插入元素,在隊首刪除元素。隊列用于存儲按順序排列的數據,先進先出,這點和棧不一樣(后入先出)。在棧中,最后入棧的元
推薦度:
標簽: 原理 js 實例
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 看一级特黄a大片日本片 | 欧美人与禽zozzo性伦交 | 欧美综合国产精品日韩一 | 成人无码一区二区片 | 亚洲欧洲日产国码一级毛片 | 成人精品视频一区二区在线 | 欧美国产精品 | 欧美亚洲综合激情在线 | 国产精品久久久久久亚洲伦理 | 国产成人a一区二区 | 高清国产美女一级a毛片 | 欧美雌雄双性人交xxxx | 在线中文 | 国产成人精品曰本亚洲 | 日韩亚洲欧美一区二区三区 | 久久中文字幕久久久久91 | 亚洲视频大全 | 一区二区三区成人 | 国产视频中文字幕 | 国产一区二区三区毛片 | 美女视频黄a视频全免费应用 | 国产精品久久一区一区 | 纯毛片| 欧美一区二区三区香蕉视 | 日韩一区二区久久久久久 | 精品久久久久久久一区二区手机版 | 亚洲日本一区二区三区高清在线 | 欧美瑟图| 亚洲一区综合 | 欧美伊香蕉久久综合类网站 | 久久一区二区三区四区 | 久久久精品久久久久久久久久久 | 91国内精品久久久久免费影院 | 日韩欧美中文在线 | 欧美日韩综合网 | 久久国产精品视频一区 | 精品精品国产高清a毛片牛牛 | a级毛片在线免费观看 | 欧美日韩国 | 亚洲v欧美 | 国产精品观看 |