日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

数据结构与算法JavaScript描述——使用队列

發(fā)布時間:2025/7/14 javascript 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构与算法JavaScript描述——使用队列 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.使用隊列:方塊舞的舞伴分配問題                                    

前面我們提到過,經(jīng)常用隊列模擬排隊的人。下面我們使用隊列來模擬跳方塊舞的人。當(dāng) 男男女女來到舞池,他們按照自己的性別排成兩隊。當(dāng)舞池中有地方空出來時,選兩個隊 列中的第一個人組成舞伴。他們身后的人各自向前移動一位,變成新的隊首。當(dāng)一對舞伴 邁入舞池時,主持人會大聲喊出他們的名字。當(dāng)一對舞伴走出舞池,且兩排隊伍中有任意 一隊沒人時,主持人也會把這個情況告訴大家。 為了模擬這種情況,我們把跳方塊舞的男男女女的姓名儲存在一個文本文件中: 下面是程序代碼的實現(xiàn): <script type="text/javascript"> function Queue(){this.dataStore = [];this.enqueue = enqueue;this.dequeue = dequeue;this.front = front;this.back = back;this.toString = toString;this.empty = empty;this.count = count; }/** * 向隊尾添加一個元素 */ function enqueue(element){this.dataStore.push(element); }/** * 刪除隊首的元素: */ function dequeue(){this.dataStore.shift(); }/** * 讀取隊首的元素: */ function front(){return this.dataStore[0]; }/** * 讀取隊尾的元素: */ function back(){return this.dataStore[this.dataStore.length - 1]; }/** * 顯示隊列內(nèi)的所有元素 */ function toString(){var retStr = "";for (var i = 0; i < this.dataStore.length; ++i) {retStr += this.dataStore[i] + "\n";}return retStr; }/** * 判斷隊列是否為空 */ function empty(){if(this.dataStore.length == 0){return true;}else{return false;} }/** * 顯示隊列中有多少個元素 */ function count(){return this.dataStore.length; }//===================================使用Queue類============================================= /** * 每個舞者信息都被存儲在一個Dancer 對象中 */ function Dancer(name, sex) {this.name = name;this.sex = sex; }/** * 將舞者信息從文件中讀到程序里來 * trim() 函數(shù)除去了每行字符串后的空格 * 根據(jù)性別,將舞者加入不同的隊列 */ function getDancers(males, females){var names = read("dancers.txt").split("\n");for (var i = 0; i < names.length; ++i) {names[i] = names[i].trim();}for (var i = 0; i < names.length; ++i) {var dancer = names[i].split(" ");var sex = dancer[0];var name = dancer[1];if (sex == "F") {females.enqueue(new Dancer(name, sex));}else{males.enqueue(new Dancer(name, sex));}} }/** * 將男性和女性組成舞伴,并且宣布配對結(jié)果 */ function dance(males, females){console.log("The dance partners are: \n");while (!females.empty() && !males.empty()) {person = females.dequeue();console.log("Female dancer is: " + person.name);person = males.dequeue();console.log(" and the male dancer is: " + person.name);} }/** *測試程序: */ var maleDancers = new Queue(); var femaleDancers = new Queue(); getDancers(maleDancers, femaleDancers); dance(maleDancers, femaleDancers); if (!femaleDancers.empty()) {print(femaleDancers.front().name + " is waiting to dance."); } if (!maleDancers.empty()) {print(maleDancers.front().name + " is waiting to dance."); }//顯示等候跳舞的人數(shù) if (maleDancers.count() > 0) {print("There are " + maleDancers.count() +" male dancers waiting to dance."); } if (femaleDancers.count() > 0) {print("There are " + femaleDancers.count() +" female dancers waiting to dance."); }</script> View Code

?

?

2.使用隊列對數(shù)據(jù)進行排序                                        

隊列不僅用于執(zhí)行現(xiàn)實生活中與排隊有關(guān)的操作,還可以用于對數(shù)據(jù)進行排序。 計算機剛剛出現(xiàn)時,程序是通過穿孔卡輸入主機的,每張卡包含一條程序語句。 這些穿孔卡裝在一個盒子里,經(jīng)一個機械裝置進行排序。我們可以使用一組隊列來模擬這一過程。 這種排序技術(shù)叫做基數(shù)排序,它不是最快的排序算法,但是它展示了一些有趣的隊列使用方法。 對于0~99 的數(shù)字,基數(shù)排序?qū)?shù)據(jù)集掃描兩次。 第一次按個位上的數(shù)字進行排序,第二次按十位上的數(shù)字進行排序。每個數(shù)字根據(jù)對應(yīng)位上的數(shù)值被分在不同的盒子里。 假設(shè)有如下數(shù)字: 91, 46, 85, 15, 92, 35, 31, 22 經(jīng)過基數(shù)排序第一次掃描之后,數(shù)字被分配到如下盒子中:

根據(jù)盒子的順序,對數(shù)字進行第一次排序的結(jié)果如下: 91, 31, 92, 22, 85, 15, 35, 46 然后根據(jù)十位上的數(shù)值再將上次排序的結(jié)果分配到不同的盒子中: 最后,將盒子中的數(shù)字取出,組成一個新的列表,該列表即為排好序的數(shù)字: 15, 22, 31, 35, 46, 85, 91, 92 使用隊列代表盒子,可以實現(xiàn)這個算法。 我們需要十個隊列,每個對應(yīng)一個數(shù)字。將所有隊列保存在一個數(shù)組中,使用取余和除法操作決定個位和十位。 算法的剩余部分將數(shù)字加入相應(yīng)的隊列,根據(jù)個位數(shù)值對其重新排序,然后再根據(jù)十位上的數(shù)值進行排序, 結(jié)果即為排好序的數(shù)字。 下面是代碼的實現(xiàn): <script type="text/javascript"> function Queue(){this.dataStore = [];this.enqueue = enqueue;this.dequeue = dequeue;this.front = front;this.back = back;this.toString = toString;this.empty = empty;this.count = count; }/** * 向隊尾添加一個元素 */ function enqueue(element){this.dataStore.push(element); }/** * 刪除隊首的元素: */ function dequeue(){return this.dataStore.shift(); }/** * 讀取隊首的元素: */ function front(){return this.dataStore[0]; }/** * 讀取隊尾的元素: */ function back(){return this.dataStore[this.dataStore.length - 1]; }/** * 顯示隊列內(nèi)的所有元素 */ function toString(){var retStr = "";for (var i = 0; i < this.dataStore.length; ++i) {retStr += this.dataStore[i] + "\n";}return retStr; }/** * 判斷隊列是否為空 */ function empty(){if(this.dataStore.length == 0){return true;}else{return false;} }/** * 顯示隊列中有多少個元素 */ function count(){return this.dataStore.length; }//===================================使用Queue類============================================= /** * 根據(jù)相應(yīng)位(個位或十位)上的數(shù)值,將數(shù)字分配到相應(yīng)隊列 * nums: 待排序的數(shù)組 * queues: 隊列數(shù)組 * n: nums的length * 參數(shù)digit 1-按照個位數(shù)排序,10-按照十位數(shù)排序 */ function distribute(nums, queues, n, digit){for(var i=0; i<n; i++){if(digit == 1){queues[nums[i]%10].enqueue(nums[i]);}else{var k = Math.floor(nums[i]/10); queues[k].enqueue(nums[i]);}} }/** * 從隊列中收集數(shù)字的函數(shù) */ function collect(queues, nums){var i=0;for(var j=0; j<queues.length; j++){while(!queues[j].empty()){nums[i++] = queues[j].dequeue();}} }//測試程序 //1.定義queues 和 nums var queues = []; for (var i = 0; i < 10; ++i) {queues[i] = new Queue(); } var nums = []; for (var i = 0; i < 10; ++i) {nums[i] = Math.floor(Math.random() * 101); }console.log("Before radix sort: "); console.log(nums); distribute(nums, queues, nums.length, 1); //按照個位數(shù)進行第一次排序 collect(queues, nums); //對按照個位數(shù)排好序的隊列,每個隊列挨排出列,組成新的數(shù)組 distribute(nums, queues, nums.length, 10); //按照十位數(shù)進行第二次排序 collect(queues, nums); console.log("After radix sort: "); console.log(nums);</script> View Code

打印出來如下:

?

?

3.優(yōu)先隊列:

在一般情況下,從隊列中刪除的元素,一定是率先入隊的元素。 但是也有一些使用隊列的應(yīng)用,在刪除元素時不必遵守先進先出的約定。這種應(yīng)用,需要使用一個叫做優(yōu)先隊列的數(shù)據(jù)結(jié)構(gòu)來進行模擬。 從優(yōu)先隊列中刪除元素時, 需要考慮優(yōu)先權(quán)的限制。 比如醫(yī)院急診科的候診室,就是一個采取優(yōu)先隊列的例子。當(dāng)病人進入候診室時,分診護士會評估患者病情的嚴(yán)重程度,然后給一個優(yōu)先級代碼。高優(yōu)先級的患者先于低優(yōu)先級的患者就醫(yī),同樣優(yōu)先級的患者按照先來先服務(wù)的順序就醫(yī)。 先來定義存儲隊列元素的對象,然后再構(gòu)建我們的優(yōu)先隊列系統(tǒng): function Patient(name, code) { this.name = name; this.code = code; } 變量code 是一個整數(shù),表示患者的優(yōu)先級或病情嚴(yán)重程度。 現(xiàn)在需要重新定義dequeue() 方法,使其刪除隊列中擁有最高優(yōu)先級的元素。 我們規(guī)定:優(yōu)先碼的值最小的元素優(yōu)先級最高。 新的dequeue() 方法遍歷隊列的底層存儲數(shù)組,從中找出優(yōu)先碼最低的元素,然后使用數(shù)組的splice() 方法刪除優(yōu)先級最高的元素。 最后,需要定義toString() 方法來顯示Patient 對象。 代碼實現(xiàn)如下: <script type="text/javascript"> function Queue(){this.dataStore = [];this.enqueue = enqueue;this.dequeue = dequeue;this.front = front;this.back = back;this.toString = toString;this.empty = empty;this.count = count; }/** * 向隊尾添加一個元素 */ function enqueue(element){this.dataStore.push(element); }/** * 使用簡單的順序查找方法尋找優(yōu)先級最高的元素(優(yōu)先碼越小優(yōu)先級越高,比如,1 比5 的優(yōu)先級高) * 返回包含一個元素的數(shù)組——從隊列中刪除的元素。 * * 假設(shè)第0個位置的優(yōu)先級最小。 * 找到比這個優(yōu)先級更小的位置,然后更新位置。 */ function dequeue(){var priority = 0;for(var i=1; i<this.dataStore.length; i++){if(this.dataStore[i].code < this.dataStore[priority].code){priority = i;}}return this.dataStore.splice(priority, 1); }/** * 讀取隊首的元素: */ function front(){return this.dataStore[0]; }/** * 讀取隊尾的元素: */ function back(){return this.dataStore[this.dataStore.length - 1]; }/** * 顯示隊列內(nèi)的所有元素 */ function toString(){var retStr = "";for (var i = 0; i < this.dataStore.length; ++i) {retStr += this.dataStore[i].name + ", code: "+ this.dataStore[i].code + "\n";}return retStr; }/** * 判斷隊列是否為空 */ function empty(){if(this.dataStore.length == 0){return true;}else{return false;} }/** * 顯示隊列中有多少個元素 */ function count(){return this.dataStore.length; }//===================================使用Queue類============================================= function Patient(name, code) {this.name = name;this.code = code; }//優(yōu)先隊列的實現(xiàn): var p = new Patient("Smith",5); var ed = new Queue(); ed.enqueue(p); p = new Patient("Jones", 4); ed.enqueue(p); p = new Patient("Fehrenbach", 6); ed.enqueue(p); p = new Patient("Brown", 1); ed.enqueue(p); p = new Patient("Ingram", 1); ed.enqueue(p); console.log(ed.toString()); console.log("-------------------------------");var seen = ed.dequeue(); console.log("Patient being treated: " + seen[0].name); console.log("Patients waiting to be seen: "); console.log(ed.toString()); console.log("-------------------------------");// 下一輪 var seen = ed.dequeue(); console.log("Patient being treated: " + seen[0].name); console.log("Patients waiting to be seen: "); console.log(ed.toString()); console.log("-------------------------------");var seen = ed.dequeue(); console.log("Patient being treated: " + seen[0].name); console.log("Patients waiting to be seen: "); console.log(ed.toString());</script>

打印結(jié)果:

?

轉(zhuǎn)載于:https://www.cnblogs.com/tenWood/p/7215502.html

總結(jié)

以上是生活随笔為你收集整理的数据结构与算法JavaScript描述——使用队列的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。