本文阐述了JavaScript数据结构和算法的排队原理和用法。分享给大家参考,如下:
队列是一种列表。不同的是,队列只能在队列末尾插入元素,在队列头删除元素。队列用于存储按顺序排列的数据,不同于堆栈(后进先出)。在堆栈中,堆栈中的最后一个元素被优先处理。现在我们可以把排队想象成我们去餐馆吃饭的场景。很多人排队吃饭,前排的人先做饭。新人要在后面排队。直到轮到他们。
首先,队列的操作
队列有两个主要操作,包括将新的元素enqueue()插入队列的末尾,以及enqueue()删除队列头的元素。此外,我们还有一个读取队列头的元素。这种方法可以称为front()。这个方法返回队列头元素等等。
看到上面的描述,我们很多人可能会想到数组。数组中还有两种方法与上述方法功能相似。数组中的push()方法还会在数组后面添加新元素,数组中的shift()方法可以删除数组中的第一个元素。以下代码:
var arrs=[];arrs . push(' a ');arrs . push(' b ');console . log(arrs);//['a ',' b '];arrs . shift();console . log(arrs);//[' b '];接下来,我们可以使用上面数组中push()和shift()两种方法封装我们的Queue类;
1.我们可以首先定义一个构造函数Queue类,如下所示:
函数Queue(){ this . datastore=[];}如上:this . Datastore=[];当数组为空时,存储队列中所有元素的。
2.在团队末尾添加一个元素,如下所示:
函数enqueue(元素){ this.dataStore.push(元素);}3.删除团队负责人的要素如下:
函数出列(){ return this . datastore . shift()} 4。读取队列头的元素,如下所示:
函数front(){ return this . Datastore[0];}5.读取队列末尾的元素,如下所示:
function back(){ return this . datastore[this . datastore . length-1];}6.显示队列中的所有元素
函数toString(){ var retStr=' ';for(var I=0;I this . Datastore . length;I){ retStr=this . datastore[I]' n ';}返回retStr}7.确定队列是否为空,如下所示:
函数empty(){ if(this . Datastore . length==0){ return true;} else { return false}}下面是完整的JS代码,如下所示:
函数Queue(){ this . datastore=[];}Queue.prototype={//将元素enqueue:function(元素){this.datastore.push(元素)添加到队列的末尾;},//删除元素出列: function(){ return this . datastore . shift();},//读取元素front : function(){返回此。数据存储[0];},//读取队列末尾的元素back : function(){ return this . datastore[this . datastore . length-1];},//显示队列中的所有元素tostring : function(){ varretstr=' ';for(var I=0;I this . Datastore . length;I){ retStr=this . datastore[I]' n ';}返回retStr},//判断队列是否为空empty:function () {if (this。数据存储。length==0){返回true} else { return false} }};我们现在可以如下测试上述代码:
var q=新队列();q . enqueue(' a ');q . enqueue(' b ');q . enqueue(' c ');console . log(q . tostring());//a b cq .出列();console . log(q . tostring());//b cconsole . log(' Front of queue : ' q . Front());//bconsole . log(' Back of queue : ' q . Back());//c 2:使用队列对数据进行排序
例如,从0到99对数字进行排序,原则是先按一位对数字进行排序,然后再按十位对数字进行排序。每个数字根据对应位上的值分成不同的框,然后一位上的数字除以余数,十位上的数字除以除法,所以这种排序称为“基数排序”。然而,它不是最快的排序方法,但它描述了一些有趣的队列使用方法。
例如,以下数组:
var nums=['50 ',' 12 ',' 95 ',' 7 ',' 90 ',' 3 ',' 74 ',' 81 ',' 91 ',' 72 '];1.基数排序-位排序之后,数字被分配到不同的框中。(在JS中,我们可以将其分配给不同的Queue实例类。).如下
队列[0]=50或90队列[1]=81或91队列[2]=12或72队列[3]=3队列[4]=74队列[5]=95队列[6]队列[7]=7队列[8]队列
Nums=[50,90,81,91,12,72,3,74,95,7] 2。然后,根据十位数上的数值,将最后一次排序后的结果分配到不同的框中。如下所示:
队列[5]=50个队列[9]=90个队列[8]=81个队列[9]=91个队列[1]=12个队列[7]=72个队列[0]=3个队列[7]=74个队列[9]=95个队列如下:
它可以按如下方式生成:
nums=[3,7,12,50,72,74,81,90,91,95];使用上面的队列列表框,可以实现这个算法。我们需要10个队列,每个队列对应一个数字,所有队列都存储在一个数组中,余数和除法运算用来确定位数和十位数。算法的其余部分将数字添加到相应的队列中,根据一位数的值对它们进行重新排序,然后根据十位数的值对它们进行排序,最后将排序后的数字相加。
以下函数根据一位或十位的数值为相应的队列分配数字。
/* *根据以位或十位为单位的数值将数字分配给相应队列的函数* @param digit* digit=1表示按照位优先分配数字* digit=10表示按照十位分配数字* @param n表示循环比较通用数组的次数*/Distribute :函数(nums,queues,n,digit){ I n;i) { if(数字==1) { queues[nums[i] % 10]。入队(nums[I]);} else { queues[Math . floor(nums[I]/10)]。入队(nums[I]);}}}下面是从队列中收集号码的功能,如下所示:
//collect :函数(queues,nums,n){ var I=0;for(var数字=0;数字n;数字){ while(!队列[数字]。empty()) { nums[i ]=queues[digit]。出列();}}}因为上面省略了很多步骤,所以描述可能不是很清楚。我们先看流程图,结合流程图,最后结合JS的所有代码,了解‘基数排序’的基本原理;下面我们可以看看下面的流程图;
最后,所有JS代码如下:
函数Queue(){ this。datastore=[];}Queue.prototype={ //向队尾添加一个元素入队:函数(元素){ this.dataStore.push(元素);}, //删除队首的元素出列:函数(){返回这个。数据存储。shift();}, //读取队首的元素front:函数(){返回这个。数据存储[0];}, //读取队尾的元素back:函数(){返回这个。数据存储[这个。数据存储。长度-1];}, //显示队列内的所有元素toString:函数(){ var retStr=for(var I=0;我喜欢这个。数据存储。长度;I){ retStr=这个。数据存储[I]' n ';}返回retStr},//判断队列是否为空空:函数(){ if(this。数据存储。length==0){返回true} else { return false} },/* *根据个位或十位上的数值,将数字分配到相应队列的函数* @param数字*数字=1表示先按个位来分配*数字=10表示是按十位来分配的* @param n表示循环比较多少次一般数组几个数字就比较多少次*/distribute:函数(nums,queues,n,digit){ for(var I=0;I n;i) {如果(数字==1) {队列[nums[i] % 10].入队(nums[I]);} else { queues[Math。地板(nums[I/10]).入队(nums[I]);} } }, //收集数字的函数collect:函数(队列,nums,n){ var I=0;用于(var数字=0;数字n;数字){ while(!队列[数字]。empty()) { nums[i ]=queues[digit].出列();} } },dispArray:函数(arr){ for(var I=0;一、长度;I){控制台。日志;} }};下面的是对'基数排序的射流研究…代码进行测试;如下代码:
var q=新队列();q .入队(' a ');q .入队(' b ');q .入队(' c ');控制台。log(q . tostring());q。出列();控制台。log(q . tostring());控制台。日志('队列:的前面' q . Front());控制台。日志(‘队列:的背面’q . Back());var queues=[];for(var I=0;I 10I){ queues[I]=new Queue();}var nums=['50 ',' 12 ',' 95 ',' 7 ',' 90 ',' 3 ',' 74 ',' 81 ',' 91 ',' 72 '];console.log('在基数排序:之前');控制台。日志(nums);q.distribute(nums,queues,10,1);q.collect(队列,nums,10);q . disparray(nums);console.log('分割线');q.distribute(nums,queues,10,10);q.collect(队列,nums,10);q . disparray(nums);如上测试代码大家可以运行下就可以看到排序后的效果!
更多关于Java脚本语言相关内容感兴趣的读者可查看本站专题: 《JavaScript数据结构与算法技巧总结》 、 《JavaScript数学运算用法总结》 、 《JavaScript排序算法总结》 、 《JavaScript遍历算法与技巧总结》 、 《JavaScript查找算法技巧总结》 及《JavaScript错误与调试技巧总结》
希望本文所述对大家Java脚本语言程序设计有所帮助。