JavaScript数据结构——队列的实现

  前面楼主简单介绍了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   判断队列是否为空

  

队列的实现

 1 function Queue(array) {
 2     if (array instanceof Array) {
 3         this.dataStorage = array;
 4     } else {
 5         throw "‘"+array + "‘ is not an Array";
 6     }
 7 }
 8
 9 Queue.prototype = {
10     enqueue: function (element) {//向队列中添加元素
11         this.dataStorage.push(element);
12     },
13     dequeue: function () {//删除队首元素
14         return this.dataStorage.shift();
15     },
16     front: function () {//返回队首元素
17         return this.dataStorage[0];
18     },
19     back: function () {//返回队尾元素
20         return this.dataStorage[this.dataStorage.length - 1];
21     },
22     toString: function () {//输出队列中所有元素
23         var result = "";
24         for (var i = 0; i < this.dataStorage.length; i++) {
25             result += this.dataStorage[i] + "\t";
26         }
27         return result;
28     },
29     empty: function () {//判定队列是否为空
30         if (this.dataStorage.length == 0) {
31             return true;
32         }
33         return false;
34     }
35 }

  测试:  

1  var queue = new Queue([‘a‘,‘b‘]);
2 console.log(queue.toString());
3 //queue.dequeue();//a出队
4 //console.log(queue.toString());
5 console.log(queue.front());//队头元素
6 console.log(queue.back());//队尾元素
7 queue.dequeue();
8 queue.dequeue();
9 console.log(queue.empty());

队列的应用——基数排序

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

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

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

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

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

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

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

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

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

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

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

 1      function allocation(nums,queues,n,digit) {
 2             for (var i = 0; i < n; ++i) {
 3                 if (digit == 1) {
 4                     queues[nums[i] % 10].enqueue(nums[i]);
 5                 }
 6                 else {
 7                     queues[Math.floor(nums[i] / 10)].enqueue(nums[i]);
 8                 }
 9             }
10         }

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

1     function collection(queues, nums) {
2             var i = 0;
3             for (var digit = 0; digit < 10; ++digit) {
4                 while (!queues[digit].empty()) {
5                     nums[i++] = queues[digit].dequeue();
6                 }
7             }
8         }

  测试程序:

 1         var queues = [];
 2         for (var i = 0; i < 10; ++i) {
 3             queues[i] = new Queue([]);
 4         }
 5         var nums = [];
 6         for (var i = 0; i < 10; ++i) {//目标排序数组
 7             nums[i] = Math.floor(Math.floor(Math.random() * 101));
 8         }
 9         console.log("排序前:");
10         showArray(nums);
11         allocation(nums, queues, 10, 1);
12         collection(queues, nums);
13         allocation(nums,queues,10,10);
14         collection(queues, nums);
15         console.log("排序后");
16         showArray(nums);
17
18         function showArray(array) {
19             console.log(array);
20         }     

  结果:

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

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

时间: 2024-10-20 15:12:39

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

javascript数据结构——队列

队列是一种先进先出的数据结.队列只能在队尾插入元素,在队首删除元素,这点和栈不一样.它用于存储顺序排列的数据.队列就像我们日常中的排队一样,排在最前面的第一个办理业务,新来的人只能在后面排队.队列这种数据结构在编程中被用到很多地方. 定义队列的操作 上图展示了队列的两个操作,入队和出队.出队操作是删除对头的元素,入队操作是在队尾添加元素.除此之外我们还需要能够获取队首和队尾的元素或者全队列的元素,还需要知道队列的长度,还需要一个方法来清空队列,由此,我们定义队列的方法. enqueue()   

javascript数据结构-队列

gihub博客地址 队列(Queue)是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插入操作的端称为队尾,进行删除操作的端称为队头. 队列类 function Queue(){ this.data = []; } 添加数据 数据添加到末尾 enqueue: function(element) { this.data.push(element); } 删除数据 从头部删除 dequeu

JavaScript数据结构——图的实现

在计算机科学中,图是一种网络结构的抽象模型,它是一组由边连接的顶点组成.一个图G = (V, E)由以下元素组成: V:一组顶点 E:一组边,连接V中的顶点 下图表示了一个图的结构: 在介绍如何用JavaScript实现图之前,我们先介绍一些和图相关的术语. 如上图所示,由一条边连接在一起的顶点称为相邻顶点,A和B是相邻顶点,A和D是相邻顶点,A和C是相邻顶点......A和E是不相邻顶点.一个顶点的度是其相邻顶点的数量,A和其它三个顶点相连,所以A的度为3,E和其它两个顶点相连,所以E的度为2

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

队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素.队列用于存储按顺序排列的数据,先进先出,这点和栈不一样(后入先出).在栈中,最后入栈的元素反而被优先处理.我们现在可以把队列想象对我们去餐馆吃饭的情景,很多人排队吃饭,排在最前面的人先打饭.新来的人只能在后面排队.直到轮到他们为止. 一:对队列的操作 队列有2种主要的操作,向队尾中插入新元素enqueue()方法和删除队列中的队首的元素的dequeue()方法,另外我们还有一个读取队头的元素,这个方法我们可以叫front()方法.该

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

队列是只允许在一端进行插入操作,另一个进行删除操作的线性表,队列是一种先进先出(First-In-First-Out,FIFO)的数据结构 队列在程序程序设计中用的非常的频繁,因为javascript单线程,所以导致了任何一个时间段只能执行一个任务,而且还参杂了异步的机制, 那么带来的问题: 1. 在异步操作执行的时候,同步代码还在继续,那么同步代码依赖异步,自然就会出错 2. 多个同步的任务在不同的时间段被调用     jQuery的动画中,我们经常写一段连续的动画代码 $book.anima

javascript数据结构和算法 零(前记+序言)

前记 这本书Data Structure and Algorithm with Javascript 我将其翻译成<< javascript 数据结构和算法>> 为什么这么翻译?而不是翻译成"用javascript实现数据结构和算法" 原因有二: 一个,我觉的它更加简洁,第二个,我是想强调我们在这里使用的是javascript. 我不喜欢一些翻译的人把一个简单的语句进行加工,搞得晦涩难懂.我更喜欢外国人写书的 那种原汁原味.同样,我很喜欢外国人的那种分享精神,它

javascript数据结构和算法 一(本书组织结构)

环境 我们在本书中使用的Javascript编程环境是基于SpiderMonkey 引擎的javascript shell. 第一章讲述了在你的环境中下载 shell的介绍. 其他的shell例如Nodejs同样可以工作,虽然你可能需要简单的改变下代码. 除了shell,唯一你要准备的就是文本编辑器. 本书的组织结构 第一章:javascript语言的概览,至少是在本书中使用的javascript的一些特征.这一章同时展示了在整本书中使用的一些编程风格. 第二章:讨论了在计算机科学中最通用的数据

算法入门《数据结构与算法图解》+《我的第一本算法书》+《学习JavaScript数据结构与算法第3版》

最近几年学前端的人会越来越多,再加上前端的范围越来越广,从前端发展为全栈,数据结构和算法的功底要求势必将越来越高. <数据结构与算法图解>电子书及代码是数据结构与算法的入门指南,不局限于某种特定语言,略过复杂的数学公式,用通俗易懂的方式针对编程初学者介绍数据结构与算法的基本概念,培养编程逻辑.主要内容包括:为什么要了解数据结构与算法,大O表示法及其代码优化利用,栈.队列等的合理使用,等等. <算法图解>电子书非常的体贴,看起来也很快,用图来解释算法是非常好的想法,可作为学习数据结构

JavaScript数据结构总结

一.什么是数据结构高层数据结构是用于存储和组织数据的技术,这些数据使修改,导航和访问变得更加容易.数据结构决定了如何收集数据,我们可以用来访问数据的功能以及数据之间的关系.数据结构几乎用于计算机科学和编程的所有领域,从操作系统到基本的编码再到人工智能.数据结构使我们能够: 管理和利用大型数据集 从数据库中搜索特定数据 针对特定程序量身定制的设计算法 一次处理来自用户的多个请求 简化并加速数据处理 数据结构对于有效,现实地解决问题至关重要.毕竟,我们组织数据的方式对性能和可用性有很大影响.实际上,