1.使用队列:方块舞的舞伴分配问题                                    

前面我们提到过,经常用队列模拟排队的人。下面我们使用队列来模拟跳方块舞的人。当
男男女女来到舞池,他们按照自己的性别排成两队。当舞池中有地方空出来时,选两个队
列中的第一个人组成舞伴。他们身后的人各自向前移动一位,变成新的队首。当一对舞伴
迈入舞池时,主持人会大声喊出他们的名字。当一对舞伴走出舞池,且两排队伍中有任意
一队没人时,主持人也会把这个情况告诉大家。
为了模拟这种情况,我们把跳方块舞的男男女女的姓名储存在一个文本文件中:
下面是程序代码的实现:

<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];
}/**
*    显示队列内的所有元素
*/
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() 函数除去了每行字符串后的空格
*    根据性别,将舞者加入不同的队列
*/
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));}}
}/**
*    将男性和女性组成舞伴,并且宣布配对结果
*/
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.");
}//显示等候跳舞的人数
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.使用队列对数据进行排序                                        

队列不仅用于执行现实生活中与排队有关的操作,还可以用于对数据进行排序。
计算机刚刚出现时,程序是通过穿孔卡输入主机的,每张卡包含一条程序语句。
这些穿孔卡装在一个盒子里,经一个机械装置进行排序。我们可以使用一组队列来模拟这一过程。
这种排序技术叫做基数排序,它不是最快的排序算法,但是它展示了一些有趣的队列使用方法。
对于0~99 的数字,基数排序将数据集扫描两次。
第一次按个位上的数字进行排序,第二次按十位上的数字进行排序。每个数字根据对应位上的数值被分在不同的盒子里。
假设有如下数字:
91, 46, 85, 15, 92, 35, 31, 22
经过基数排序第一次扫描之后,数字被分配到如下盒子中:

根据盒子的顺序,对数字进行第一次排序的结果如下:

91, 31, 92, 22, 85, 15, 35, 46
然后根据十位上的数值再将上次排序的结果分配到不同的盒子中:

最后,将盒子中的数字取出,组成一个新的列表,该列表即为排好序的数字:

15, 22, 31, 35, 46, 85, 91, 92
使用队列代表盒子,可以实现这个算法。

我们需要十个队列,每个对应一个数字。将所有队列保存在一个数组中,使用取余和除法操作决定个位和十位。
算法的剩余部分将数字加入相应的队列,根据个位数值对其重新排序,然后再根据十位上的数值进行排序,
结果即为排好序的数字。
下面是代码的实现:

<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];
}/**
*    显示队列内的所有元素
*/
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类=============================================
/**
*    根据相应位(个位或十位)上的数值,将数字分配到相应队列
*    nums: 待排序的数组
*    queues: 队列数组
*    n: nums的length
*    参数digit 1-按照个位数排序,10-按照十位数排序
*/
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]);}}
}/**
*    从队列中收集数字的函数
*/
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);            //按照个位数进行第一次排序
collect(queues, nums);                                //对按照个位数排好序的队列,每个队列挨排出列,组成新的数组
distribute(nums, queues, nums.length, 10);            //按照十位数进行第二次排序
collect(queues, nums);
console.log("After radix sort: ");
console.log(nums);</script>

View Code

打印出来如下:

3.优先队列:

在一般情况下,从队列中删除的元素,一定是率先入队的元素。
但是也有一些使用队列的应用,在删除元素时不必遵守先进先出的约定。这种应用,需要使用一个叫做优先队列的数据结构来进行模拟。
从优先队列中删除元素时, 需要考虑优先权的限制。
比如医院急诊科的候诊室,就是一个采取优先队列的例子。当病人进入候诊室时,分诊护士会评估患者病情的严重程度,然后给一个优先级代码。高优先级的患者先于低优先级的患者就医,同样优先级的患者按照先来先服务的顺序就医。
先来定义存储队列元素的对象,然后再构建我们的优先队列系统:
function Patient(name, code) {
this.name = name;
this.code = code;
}
变量code 是一个整数,表示患者的优先级或病情严重程度。
现在需要重新定义dequeue() 方法,使其删除队列中拥有最高优先级的元素。
我们规定:优先码的值最小的元素优先级最高。
新的dequeue() 方法遍历队列的底层存储数组,从中找出优先码最低的元素,然后使用数组的splice() 方法删除优先级最高的元素。
最后,需要定义toString() 方法来显示Patient 对象。
代码实现如下:
<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);
}/**
*    使用简单的顺序查找方法寻找优先级最高的元素(优先码越小优先级越高,比如,1 比5 的优先级高)
*    返回包含一个元素的数组——从队列中删除的元素。
*
*    假设第0个位置的优先级最小。
*   找到比这个优先级更小的位置,然后更新位置。
*/
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];
}/**
*    显示队列内的所有元素
*/
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;
}//优先队列的实现:
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>

打印结果:

转载于:https://www.cnblogs.com/tenWood/p/7215502.html

数据结构与算法JavaScript描述——使用队列相关推荐

  1. 资料分享:送你一本《数据结构与算法JavaScript描述》电子书!

    数据结构 是掌握计算机编程必须具备的技能.通常情况下,我想掌握一门编程语言所用的方法就是利用这门语言把数据结构中线性表.栈.队列.字符串.动态数字.整数集合.树.图.搜索.排序等涉及的算法全部写一遍. ...

  2. 关于《数据结构与算法JavaScript描述》这本书

    前端开发人员是非常有必要掌握数据结构与算法的,最近博主在温习数据结构与算法的时候,从学校图书馆借的这本书, 不看不知道,一看吓一跳,这本书上的代码出现很多的错误,根本就调试不同,而且方法乱用,是读过为 ...

  3. 数据结构与算法JavaScript描述——链表

    1.数组的缺点 数组不总是组织数据的最佳数据结构,原因如下. 在很多编程语言中,数组的长度是固定的,所以当数组已被数据填满时,再要加入新的元素就会非常困难. 在数组中,添加和删除元素也很麻烦,因为需要 ...

  4. 散列--数据结构与算法JavaScript描述(8)

    散列 散列是一种常用的数据存储技术,散列后的数据可以快速地插入或取用. 散列使用的数据结构叫做散列表. 在散列表上插入.删除和取用数据都非常快,但是对于查找操作来说却效率低下,比如查找一组数据中的最大 ...

  5. 数据结构与算法JavaScript (一) 栈

    序 数据结构与算法JavaScript这本书算是讲解得比较浅显的,优点就是用javascript语言把常用的数据结构给描述了下,书中很多例子来源于常见的一些面试题目,算是与时俱进,业余看了下就顺便记录 ...

  6. 数据结构与算法之猫狗队列

    数据结构与算法之猫狗队列 目录 猫狗队列 1. 猫狗队列 描述 代码实现 import java.util.LinkedList; import java.util.Queue;public clas ...

  7. 04_JavaScript数据结构与算法(四)队列

    JavaScript 数据结构与算法(四)队列 认识队列 队列(Queue)是一种运算受限的线性表,特点:先进先出.(FIFO:First In First Out) 受限之处: 只允许在表的前端(f ...

  8. 数据结构与算法(C++)– 队列(Queue)

    数据结构与算法(C++)– 队列(Queue) 1.队列 先进先出(First in, First out) enqueue 入队,dequeue 出队 front 队头,rear / back 队尾 ...

  9. 101道算法javaScript描述【一】

    文章目录 小册介绍 你会收获到什么? 适宜人群 你需要准备什么 学习指南 高效地学习 一起变得更好 最后 开篇--复杂度 时间复杂度 常见的时间复杂度 递归的时间复杂度 空间复杂度 常见的空间复杂度 ...

最新文章

  1. pyqt5实战之透明样式和页面切换和弹出新窗口
  2. cf1556B B. Take Your Places!
  3. 如何利用光衰减器测试光纤收发器的灵敏度?
  4. 山东大学青岛计算机学院贺平,计算机学院学子在全国数学建模竞赛中再获佳绩...
  5. 没有并发经验,但是面试中经常被问到高并发,怎么破局?
  6. 是什么会议_会议签到是什么,会议签到过程是怎样的?
  7. 应届生去软通动力怎么样_超强干货:应届生如何找实习工作?
  8. 深度解析两大应用内测分发工具Pre.im与TestFlight
  9. SRP6针对于网游登录服的应用
  10. R语言数据可视化---交互式图表recharts包
  11. 根目录下的/lib64也不能删除
  12. android盒子没声音,安卓手机投屏,投影仪没有声音解决办法
  13. 人人羡慕的阿里程序员,也是等级分明的,你属于哪个等级呢
  14. 从0开始,如何设计一个社交电商产品
  15. kaggle入门--泰坦尼克号之灾(手把手教你)
  16. 【办公】罗技设备(基于M590)使用方法
  17. linux 键盘测试程序员,程序员之家打字测试
  18. mysql 留存率_mysql查询用户留存语法(用户留存和用户留存率问题)
  19. 数据堂CEO齐红威应邀出席“数据要素市场制度体系建设”专家研讨会
  20. go设置后端启动_名企实习项目|后端开发岗go微服务实战项目启动,大牛导师带你拿offer!...

热门文章

  1. python线性回归实例_python 线性回归示例
  2. js/jq基础(日常整理记录)-3-一个自定义表格
  3. 我读过的最好的epoll讲解--转自”知乎“ 【转】
  4. Android渲染机制和丢帧分析
  5. 一个有趣的算法问题:如何定义一个分数类
  6. MongoDB 查询超时异常 SocketTimeoutException
  7. NetBpm 组织架构(4)
  8. Centos 6 安装 配置 oracle11g R2
  9. oracle 10g 用户管理笔记
  10. [转]double free or corruption (!prev): 0x080644c8 ***