javascript中的队列结构
1.概念
队列和栈结构不同,栈是一种后进先出的结构,而队列是一种先进先出的结构。队列也是一种表结构,不同的是队列只能在队尾插入元素,在队首删除元素,可以将队列想象成一个在超时等待排队付钱的队伍,或者在银行拿的号子,排在前面的人拥有优先服务权。队列是一种FIFO(First In First Out)。队列用在很多地方,比如提交操作系统执行一系列的进程,打印任务池等,一些仿真系统使用队列来模拟银行或者超时里排队的顾客。
队列主要有两种操作,祥队列中插入新元素和删除队列中的元素。插入操作也叫入队,删除操作也叫出队。入队操作在队尾插入新元素,出队操作删除队头的元素。队列的应外一项重要操作是读取队头的元素,这个操作叫做peek(),这个操作返回对头元素,并不删除它。除了读取对头元素我们还想知道队列中存储了多少元素,可以使用length属性满足该要求,想要清空队列中的所有元素,可以使用clear()方法来实现。
使用数组来实现队列看起来顺理成章,javascript中的数组有其他编程语言中没有的有点,数组使用push()方法可以在数组的末尾加入元素,使用shift()方法可以删除数组的第一个元素。push()方法将它的参数插入数组中第一个开放的位置,该位置总在数组的末尾,即使是一个空数组也是。就是说push()插入的元素总是数组的最有一个元素。看下面的例子:
names = [];
name.push("Cynthia");
names.push("Jennifer");
现在数组中的第一个元素是Cynthia,第二个元素是Jennifer。
使用shift()方法删除数组的第一个元素。
2.实现
下面看看队列的实现方法:
/*--------------Queue类的定义和测试代码----------------*/
function Queue(){
this.dataStore = [];
this.enqueue = enqueue;
this.dequeue = dequeue;
this.front = front;
this.back = back;
this.toString = toString;
this.empty = empty;
} //入队,就是在数组的末尾添加一个元素
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] + " "
}
return retStr;
}
//判断数组是否为空
function empty(){
if(this.dataStore.length == 0){
return true;
}else{
return false;
}
}
//返回数组中元素的个数
function count(){
return this.dataStore.length;
} var q = new Queue();
q.enqueue("Meredith");
q.enqueue("Cynthia");
q.enqueue("Jennifer");
document.write(q.toString());
document.write('<br>');
document.write("Front of queue is:" + q.front());
document.write('<br>');
document.write("Back of queue is:" + q.back());
最后的输出结果为:

3.使用队列实现基数排序
队列不仅用于执行现实生活中关于队列相关的操作,还可以用于对数据进行排序。计算机刚刚出现的时候,程序是通过穿孔输入主机的,每一张卡包含一条程序语句。这些穿孔卡装在一个盒子里面,经过一个机械装置进行排序。我们可以用一组队列来模拟这个过程。这种排序技术叫做基数排序。
对于0~99的数字,基数排序将数据集扫描两次。第一次按照个位上的数字进行排序,第二次按照十位上的数字进行排序。每个数组根据对应位上的数字被分配在不同的盒子里。
举例如下:假如有数字 91,46,85,15,92,35,31,22
经过基数排序第一次扫描之后按照个位数的大小排序,数字被分配大如下的盒子中
第0个盒子:
第1个盒子:91,31
第2个盒子:92,22
第3个盒子:
第4个盒子:
第5个盒子:85,15,35
第6个盒子:46
第7个盒子:
第8个盒子:
第9个盒子:
根据盒子的顺序,对数字经行第一次排序的结果如下:
91,31,92,22,85,15,35,46
然后根据十位上的数值再将上次排序结果分配到不同的盒子里
第0个盒子:
第1个盒子:15
第2个盒子:22
第3个盒子:31,35
第4个盒子:46
第5个盒子:
第6个盒子:
第7个盒子:
第8个盒子:85
第9个盒子:92,92
最后将盒子里的数字取出,组成一个新的列表,该列表即为排好顺序的数字:
15,22,31,35,46,85,91,92
使用队列代表盒子,可以实现这个算法,我们需要9个队列,每个对应一个数字。将所有队列保存在一个数组中,使用取余和出发操作决定各位和十位。算法的剩余部分将数字加入对应的队列,根据个位数值重新排序,然后再根据十位数值经行排序,结果即为排好顺序的数字。
下面我们来看代码实现:
/*--------------Queue类的定义和测试代码----------------*/
function Queue(){
this.dataStore = [];
this.enqueue = enqueue;
this.dequeue = dequeue;
this.front = front;
this.back = back;
this.toString = toString;
this.empty = empty;
} //入队,就是在数组的末尾添加一个元素
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] + " "
}
return retStr;
}
//判断数组是否为空
function empty(){
if(this.dataStore.length == 0){
return true;
}else{
return false;
}
}
//返回数组中元素的个数
function count(){
return this.dataStore.length;
} /*----------------基数排序-----------------*/
document.write('<br><br>');
function distribute(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]);
}
}
} //收集队列中的数字放在数字nums中
function collect(queues,nums){
var i=0;
for (var digit=0; digit<10; ++digit) {
while (!queues[digit].empty()){
nums[i++] = queues[digit].dequeue();
}
}
} function dispArray(arr){
for (var i=0; i<arr.length; ++i) {
document.write(arr[i] + " ");
}
} //初始化9个队列
var queues = [];
for (var i=0; i<10; i++) {
queues[i] = new Queue();
}
//初始化10个二位整数
var nums = [];
for (var i=0; i<10; ++i) {
nums[i] = Math.floor(Math.random()*100);
} document.write('排序之前');document.write('<br>');
dispArray(nums);
document.write('<br>');
//按照个位数字入相应的队列
distribute(nums, queues, 10, 1);
//收集队列中的数字放在数组nums中
collect(queues, nums);
//按照十位数字如相应的队列
distribute(nums, queues, 10, 10);
//手机队列中的数字放在nums中
collect(queues, nums);
document.write("排序之后");document.write('<br>');
dispArray(nums);
输出结果如下:

javascript中的队列结构的更多相关文章
- JavaScript中的分支结构
说到JavaScript中的分支结构,我们就不得不提到流程控制这个词,我们所有的程序都是由数据和算法组成的.程序=数据+算法通常我们所说的算法都可以通过"顺序","分支& ...
- javascript中的链表结构—从链表中删除元素
1.概念 上一个博文我们讲到链表,其中有一个方法remove()是暂时注释的,这个方法有点复杂,需要添加一个Previous()方法找到要删除的元素的前一个节点,这一个博文我们来分析一下这个remov ...
- javascript中的链表结构
1.定义 很多编程语言中数组的长度是固定的,就是定义数组的时候需要定义数组的长度,所以当数组已经被数据填满的时候,需要再加入新的元素就很困难.只能说在部分变成语言中会有这种情况,在javascript ...
- javascript中的表结构
列表是一种常见的数据结构,通常列表是一族有徐的数据,列表中的数据项称为元素.在javascript中列表中的数据可以是任意类型的,列表中可以保存多少元素没有事先限定,实际使用时元素的数量只收到程序内内 ...
- Javascript中的各结构的嵌套和函数
各位朋友大家好,上周更新给大家分享了JavaScript的入门知识及各种常用结构的用法,那么,本次更新博主就跟大家更深入的聊一聊JS各结构的嵌套用法,及JS中及其常用的一种结构——函数.以下为函数和循 ...
- javascript中的链表结构—双向链表
1.概念 上一个文章里我们已经了解到链表结构,链表的特点是长度不固定,不用担心插入新元素的时候新增位置的问题.插入一个元素的时候,只要找到插入点就可以了,不需要整体移动整个结构. 这里我们了解一下双向 ...
- javascript中的栈结构
1.栈的定义 栈是一种和列表类似的数据结构,可以用它来解决很多的编程问题,栈是一种高效的数据结构,因为数据只能在栈的顶端添加或者删除,所以这样的操作很快而且容易实现. 栈是一种特殊的列表,站内的元素只 ...
- Javascript中的队列
队列遵循FIFO (First In First Out)原则. 普通队列 function Queue() { var items=[]; //向队列尾部添加一个或者多个元素 this.enqueu ...
- JavaScript中的算法之美——栈、队列、表
序 最近花了比较多的时间来学习前端的知识,在这个期间也看到了很多的优秀的文章,其中Aaron可能在这个算法方面算是我的启蒙,在此衷心感谢Aaron的付出和奉献,同时自己也会坚定的走前人这种无私奉献的分 ...
随机推荐
- javascript --- 设计模式之单体模式(二)
在JavaScript里,实现单例的方式有很多种,其中最简单的一个方式是使用对象字面量的方法,其字面量里可以包含大量的属性和方法: var her = { property1: 'someing', ...
- 复杂领域的Cynefin模型和Stacey模型
最近好奇“复杂系统”,收集了点资料,本文关于Cynefin模型和Stacey模型.图文转自互联网后稍做修改. Cynefin模型提供一个从因果关系复杂情度来分析当前情况而作决定的框架,提出有五个领域: ...
- 学写了一段LINQ
要写一段代码读入一个用空格分隔的几列的文件,程序中有多处类似的文件,所以想着有没有什么好点的办法. 井名 X坐标 Y坐标 深度 测试井1 634600 ...
- 在Android开发中使用Ant 一:环境的搭建及入门
配置Ant环境 下载Ant:http://ant.apache.org/bindownload.cgi 在windows上应该选择zip压缩包,将zip压缩包解压到一个目录. 打开系统环境变量,在系统 ...
- 【原/转】UITableview性能优化总结
UITableView作为ios中使用最频繁的控件之一,其性能优化也是常常要面对的,尤其是当数据量偏大并且设备性能不足时.本文旨在总结tableview的几个性能优化tips,并且随着认识的深入,本文 ...
- 通过StoryBoard加载视图控制器问题
如果通过拉线的方式拉进来一个UIViewController,再将它绑定一个UIViewController类.创建的时候通过alloc,init创建出来并不会创建出一个你拉进来的UIViewCont ...
- paas架构之docker——安装
1. 概要 本文描述docker的安装 参考官方文档:https://docs.docker.com/engine/installation/linux/ubuntulinux/ 安装操作系统: Ub ...
- 日常工作生活中的做人做事道理[持续更新ing]
1.凡是预则立,不预则废 2.不能用特殊案例说明事情本身的发展规律 3.任务不能拖,需主动出击,想方设法完成 4.工作要有细致化的沟通和安排 5.解决问题和安排任务可以逆向思维的去想 6.问题要举一反 ...
- JavaScript Patterns 3.7 Primitive Wrappers
Primitive value types: number, string, boolean, null, and undefined. // a primitive number var n = 1 ...
- 通过正则获取URL中的参数
闲着无聊用正则做了一个获取URL参数的小算法^_^ function getParam(name) { var objs = window.location.search.match("(\ ...