前面楼主简单介绍了JavaScript数据结构栈的实现,http://www.cnblogs.com/qq503665965/p/6537894.html,本次将介绍队列的实现。

  队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

  队列的两种主要操作是:向队列中插入新元素和删除队列中的元素。插入操作也叫做入队,删除操作也叫做出队。入队操作在队尾插入新元素,出队操作删除队头的元素。下图演示了这两个操作。

  队列的另外一项重要操作是读取队头的元素。这个操作叫做 peek() 。该操作返回队头元素,但不把它从队列中删除。除了读取队头元素,我们还想知道队列中存储了多少元素,可以使用 length 属性满足该需求;要想清空队列中的所有元素,可以使用 clear() 方法来实现。下表定义了队列的一些主要方法:

 dataStorage Array 存储数据的底层数据结构
enqueue int 入队
dequeue fucntion 出队
front fucntion 返回队首元素
back fucntion 返回队尾元素
toString fucntion   显示队列内的所有元素
empty function   判断队列是否为空

  

队列的实现

 function Queue(array) {
if (array instanceof Array) {
this.dataStorage = array;
} else {
throw "'"+array + "' is not an Array";
}
} Queue.prototype = {
enqueue: function (element) {//向队列中添加元素
this.dataStorage.push(element);
},
dequeue: function () {//删除队首元素
return this.dataStorage.shift();
},
front: function () {//返回队首元素
return this.dataStorage[0];
},
back: function () {//返回队尾元素
return this.dataStorage[this.dataStorage.length - 1];
},
toString: function () {//输出队列中所有元素
var result = "";
for (var i = 0; i < this.dataStorage.length; i++) {
result += this.dataStorage[i] + "\t";
}
return result;
},
empty: function () {//判定队列是否为空
if (this.dataStorage.length == 0) {
return true;
}
return false;
}
}

  测试:  

  var queue = new Queue(['a','b']);
console.log(queue.toString());
//queue.dequeue();//a出队
//console.log(queue.toString());
console.log(queue.front());//队头元素
console.log(queue.back());//队尾元素
queue.dequeue();
queue.dequeue();
console.log(queue.empty());

队列的应用——基数排序

  原理:对于 0~99 的数字,基数排序将数据集扫描两次。第一次按个位上的数字进行排序,第二次按十位上的数字进行排序。每个数字根据对应位上的数值被分在不同的盒子里。

  假设有这样一个数组:{4, 73, 51, 76, 70, 19, 63, 64, 43, 12},经过基数排序第一次扫描之后,数字被分配到如下盒子中:  

 Box 0: 70
Box 1: 51
Box 2: 12
Box 3: 73,63,43
Box 4: 4,64
Box 5: 76
Box 6:
Box 7:
Box 8:
Box 9: 19

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

  70,51,12,73,63,43,4,64,76,19

  然后根据十位上的数值再将上次排序的结果分配到不同的盒子中:

 Box 0: 4
Box 1: 12,19
Box 2:
Box 3:
Box 4: 43
Box 5: 51
Box 6: 63,64
Box 7: 70,73,76
Box 8:
Box 9:

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

  4,12,19,43,51,63,64,70,73,76

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

  下面是根据相应位(个位或十位)上的数值,将数字分配到相应队列的方法:  

      function allocation(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]);
}
}
}

  下面是从队列中收集数字的方法: 

     function collection(queues, nums) {
var i = 0;
for (var digit = 0; digit < 10; ++digit) {
while (!queues[digit].empty()) {
nums[i++] = queues[digit].dequeue();
}
}
}

  测试程序:

         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.floor(Math.random() * 101));
}
console.log("排序前:");
showArray(nums);
allocation(nums, queues, 10, 1);
collection(queues, nums);
allocation(nums,queues,10,10);
collection(queues, nums);
console.log("排序后");
showArray(nums); function showArray(array) {
console.log(array);
}

  结果:

  下篇楼主将带来,链表的实现。

  本文的示例代码地址:https://github.com/LJunChina/JavaScript

JavaScript数据结构——队列的实现的更多相关文章

  1. javascript数据结构——队列

    队列是一种先进先出的数据结.队列只能在队尾插入元素,在队首删除元素,这点和栈不一样.它用于存储顺序排列的数据.队列就像我们日常中的排队一样,排在最前面的第一个办理业务,新来的人只能在后面排队.队列这种 ...

  2. JavaScript数据结构——队列的实现与应用

    队列与栈不同,它遵从先进先出(FIFO——First In First Out)原则,新添加的元素排在队列的尾部,元素只能从队列头部移除. 我们在前一篇文章中描述了如何用JavaScript来实现栈这 ...

  3. javascript数据结构-队列

    gihub博客地址 队列(Queue)是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插 ...

  4. JavaScript 数据结构与算法之美 - 线性表(数组、栈、队列、链表)

    前言 基础知识就像是一座大楼的地基,它决定了我们的技术高度. 我们应该多掌握一些可移值的技术或者再过十几年应该都不会过时的技术,数据结构与算法就是其中之一. 栈.队列.链表.堆 是数据结构与算法中的基 ...

  5. JavaScript数据结构——图的实现

    在计算机科学中,图是一种网络结构的抽象模型,它是一组由边连接的顶点组成.一个图G = (V, E)由以下元素组成: V:一组顶点 E:一组边,连接V中的顶点 下图表示了一个图的结构: 在介绍如何用Ja ...

  6. 学习javascript数据结构(一)——栈和队列

    前言 只要你不计较得失,人生还有什么不能想法子克服的. 原文地址:学习javascript数据结构(一)--栈和队列 博主博客地址:Damonare的个人博客 几乎所有的编程语言都原生支持数组类型,因 ...

  7. 数据结构与算法JavaScript (二) 队列

    队列是只允许在一端进行插入操作,另一个进行删除操作的线性表,队列是一种先进先出(First-In-First-Out,FIFO)的数据结构 队列在程序程序设计中用的非常的频繁,因为javascript ...

  8. javascript数据结构与算法---队列

    javascript数据结构与算法---队列 队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素.队列用于存储按顺序排列的数据,先进先出,这点和栈不一样(后入先出).在栈中,最后入栈的元素 ...

  9. JavaScript数据结构——栈和队列

    栈:后进先出(LIFO)的有序集合 队列:先进先出(FIFO)的有序集合 --------------------------------------------------------------- ...

随机推荐

  1. 在windows下安装运行disconf

    一.环境准备 1.下载disconf源码 (本文以2.6.36为例) https://github.com/knightliao/disconf 2.下载nginx1.10.2(windows版) h ...

  2. 笔记:Ubuntu 上的Testlink 部署

    1.安装apache2 sudo apt-get install apache2 2. sudo /etc/init.d/apache2 restart 测试: Http:\localhost or ...

  3. printf 格式化输出

    i,d   十进制整数 x,X    十六进制无符号整数 o       八进制无符号整数 u       无符号十进制整数 c       单一字符 s       字符串 e E    指数形式浮 ...

  4. Web前端常用快捷键总结(OS X系统)

    OS X系统截图:command + shift + 4 强制关闭OS X系统内无响应的程序:command + option +ESC Sublime Text 3: 显示或隐藏Side Bar:c ...

  5. POJ1050(dp)

    To the Max Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 46788   Accepted: 24774 Desc ...

  6. “-webkit-font-smoothing”

    CSS3里面加入了一个"-webkit-font-smoothing"属性. 这个属性可以使页面上的字体抗锯齿,使用后字体看起来会更清晰舒服. 加上之后就顿时感觉页面小清晰了. 淘 ...

  7. redis的删除库应用(linux)

    1.首先从linux进入redis的安装目录下 2.用redis-cli在Shell命令行下启动Redis客户端工具. 3.select 库名 进入到库下 4.flushdb 刷新当前库 redis的 ...

  8. 解决npm install安装了太多架包的问题

    比如我安装gulp时,会多出很多无用的包,如下图: 经过查询,原来是npm升级了导致的,在npm3.0以上的版本,包的依赖不再安装在每个架包的node_modules文件夹内,而是安装在顶层的node ...

  9. linux环境下搭建 j2ee环境

    一.JDK安装(安装在/usr/java目录下)1.下载:jdk-7-ea-bin-b26-linux-i586-24_apr_2008.bin地址:http://jx.newhua.com/down ...

  10. c#入门系列——番外篇:vs的安装与使用

    vs的安装 1.安装条件          vs全称visual studio 它是一个开发平台,不仅可以用于c#开发,别的也可以.安装vs前,首先需要一个安装包.安装包可以在网上下载.没有购买版权的 ...