第五章 队列
来源:互联网 发布:淘宝正品aj篮球鞋店铺 编辑:程序博客网 时间:2024/06/14 05:55
什么是队列?
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
队列和栈的区别
栈:后进先出,只允许在栈顶进行插入和删除。
队列:先进先出,在队尾进行插入,在对头进行删除。
一个用数组实现的队列
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] } function toString(){ var string=""; for(var i=0;i<this.datastore.length;i++){ string+=this.datastore[i]+'\n' } return string; } function count(){ return this.datastore.length; } function empty(){ if(this.datastore.length==0){ return true } else{ return false } }
unshift:在数组最开始插入一个元素(返回数组第一位);
shift:删除数组第一位
使用队列
方块舞的舞伴分配问题
队列经常用于模拟排队的人,可以用队列来模拟跳方块舞的人。
当男生女生来到舞池,他们按自己的性别排成两排,当舞池中有地方空出来时,选两个队列中的第一个人组成舞伴。他们身后的人各自向前移动一位,变成新的队首。当一对舞伴进入舞池时,主持人通报他们的名字。当一对舞伴走出舞池,且两排队列中有任意一对没人时,主持人也会把情况通报给大家。
先将男生女生的名字存在文件中。
var string=’F Allison \n M frank \n M mson \n M clayton \n F chert \n F aurora’; //模拟前来跳舞的人
function Dance(name,sex){ this.name=name; this.sex=sex }//将舞者的姓名和性别存入数组 var female=new Queue(); var male=new Queue(); //将所有舞者按照先后顺序推入不同性别的队列 function getDance(male,female){ var _dance=string.split('\n'); var _people=[]; for(var i=0;i<_dance.length;i++){ _people[i]=_dance[i].trim()//删除前后空格 } for(var j=0;j<_people.length;j++){ var dancer=_people[j].split(' '); var sex=dancer[0]; var name=dancer[1]; if(sex=='M'){ male.enqueue(new Dance(name,sex)) //将存放个人信息的对象推入队列 } else{ female.enqueue(new Dance(name,sex)) } } }
//宣布配对结果 function dance(){ while(male.count()>0&&female.count()>0){ var fpeople=female.dequeue().name; var mpeople=male.dequeue().name; console.log(fpeople+"和"+mpeople); } }
对数据进行排序
基数排序(这里只考虑小于100的数字):
对于 0~99 的数字,基数排序将数据集扫描两次。第一次按个位上的数字进行排序,第二
次按十位上的数字进行排序。每个数字根据对应位上的数值被分在不同的盒子里。假设有
如下数字:
91, 46, 85, 15, 92, 35, 31, 22
经过基数排序第一次扫描之后,数字被分配到如下盒子中:
bin 0:
bin 1: 91, 31
bin 2: 92, 22
bin 3:
bin 4:
bin 5: 85, 15, 35
bin 6: 46
bin 7:
bin 8:
bin 9:
根据盒子的顺序,对数字进行第一次排序的结果如下:
91, 31, 92, 22, 85, 15, 35, 46
然后根据十位上的数值再将上次排序的结果分配到不同的盒子中:
bin 0:
bin 1:15
bin 2: 22
bin 3: 31,35
bin 4: 46
bin 5:
bin 6:
bin 7:
bin 8: 85
bin 9: 91,92
最后,将盒子中的数字取出,组成一个新的列表,该列表即为排好序的数字:
15, 22, 31, 35, 46, 85, 91, 92
使用队列代表盒子,我们可以实现这个算法。主程序:
//使用队列进行排序 function distribute(queue,nums,n,digit){ //队列数组,排序数的数组,数组个数,基数 for(var i=0;i<n;i++){ if(digit==1){ queue[nums[i]%10].enqueue(nums[i]); } else{ queue[Math.floor(nums[i]/10)].enqueue(nums[i]); } } } function dispArray(arr){ console.log(arr); } function collect(queue,nums){ var j=0; for(var i=0;i<10;i++){ while(!queue[i].empty()){ nums[j++]=queue[i].dequeue(); } } } var queue=[],nums=[]; for(var i=0;i<10;i++){ queue[i]=new Queue(); nums[i]=Math.floor(Math.random()*100); } dispArray(nums); distribute(queue,nums,10,10); collect(queue,nums); dispArray(nums);
- 第五章 队列
- 第五章(队列)
- 第五章Linux消息队列
- 第五章 栈和队列
- UNPv2第五章:Posix消息队列
- 数据结构与算法JavaScript描述[第五章](队列)
- [翻译]C#数据结构与算法 – 第五章栈与队列(Part 1)
- [翻译]C#数据结构与算法 – 第五章栈与队列(Part 2)
- 数据结构与算法C#语言描述第五章栈和队列
- 数据结构与算法C#语言描述第五章栈和队列
- 经典第五章 例 5-6 UVA 540 Team Queue(队列的简单应用)【queue】
- 第五十七题(用俩个栈实现队列)
- 第五章
- 第五章
- 第五章
- 第五章
- 第五章
- 第五章
- 欢迎使用CSDN-markdown编辑器
- 堆排序
- [译]推荐5个值得学习React Native的开源项目
- Python: PS 滤镜-- Fish lens
- 【如何快速的开发一个完整的iOS直播app】(原理篇)
- 第五章 队列
- 吐血React-native之常见问题集合
- os.clock()获取lua代码运行时间
- Algorithm Gossip:三色旗问题
- UITableView cell嵌套textView
- Android学习笔记(1)------简易记事本
- 关于caffe innerproduct层的理解
- F1V3.0-7 Spring Cloud 介绍
- 理解MySQL——复制(Replication)