<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答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
        主站蜘蛛池模板: 亚洲精品成人区在线观看| 毛片免费在线播放| 不卡一卡二卡三亚洲| 亚洲欧美在线x视频| 在线观看国产情趣免费视频| 亚洲精品久久久久无码AV片软件| 亚洲福利电影一区二区?| 337P日本欧洲亚洲大胆艺术图 | aa级女人大片喷水视频免费| 免费人成在线观看网站视频| 自拍偷自拍亚洲精品偷一| 成人永久福利免费观看| 黄色网页免费观看| 四虎永久在线精品视频免费观看| 久久久久亚洲精品成人网小说| 国产一级片免费看| 久久久久亚洲精品日久生情| 中文字幕视频免费| 亚洲国产成人99精品激情在线| 性感美女视频免费网站午夜 | 婷婷亚洲综合五月天小说在线| 成人亚洲网站www在线观看| 久久亚洲春色中文字幕久久久| 最好看的中文字幕2019免费| 亚洲国产成人精品无码区在线网站| xxxx日本在线播放免费不卡| 国产午夜亚洲精品国产成人小说| 国内精品久久久久影院免费 | 久久精品国产亚洲AV忘忧草18| 无码高潮少妇毛多水多水免费 | 亚洲黄片手机免费观看| 无码久久精品国产亚洲Av影片| 1000部啪啪毛片免费看| 亚洲日韩精品无码专区| 亚洲精品国产福利一二区| 免费一级不卡毛片| 中文字幕在线观看亚洲日韩| 亚洲一区二区在线免费观看| 亚洲已满18点击进入在线观看| 男人的天堂亚洲一区二区三区 | 边摸边吃奶边做爽免费视频网站|