JavaScript中的数据结构及实战系列(1):队列
开题
张三丰教无忌太极剑法:
还记得吗?
全都记得.
现在呢?
已经忘却了一小半.
啊,已经忘了一大半.
不坏不坏,忘得真快,那么现在呢?
已经全都忘了,忘得干干净净.
好了,你上吧.
长时间写前端代码,将自己以前的积累都忘得一干二净,所以开了一个关于JS的数据结构系列,在业务型程序员的基础上,也要实时的优化自己的代码,让自己的代码有思想是每个程序员最自豪的事情。
本文目录
队列介绍:
相信任何有些编程基础的人都对队列不算陌生,队列是一种先进先出的接口,也就是FIFO(First Input First Output),它也是一种表结构。在队列的队尾插入数据,在队首删除数据,可以想象成我们每天早晨买豆浆时队伍。
队列只要有两个主要的功能:出队(push)和入队(pop)。入队操作在队尾插入新的元素,出队操作返回并删除队首的元素。有时候我们只需要获取队首和队尾但并不一定非要执行队列的出队和入队行为,所以我们又需要一个获取队首(getFirst)和队尾(getLast)的行为。有时我们也有全部清空本队列的动作,所以还要有clear方法。除了以上提到的我们还需要知道队列中有多少个元素,可以用length去获取。
JavaScript实现:
使用数组的push方法和shift方法可以基本完成队列的出队和入队操作,但是我们为了不让其他无关的数组属性去破坏队列结构还需要对其封装一下,所以就有了我们现在的代码:
function Queue(){
var items = [];
//入队
this.push = function(obj){
items.push(obj);
};
//出队
this.pop = function(){
return items.shift();
};
//获取队首
this.getFirst = function(){
return items[0];
};
//获取队尾
this.getLast = function(){
return items[items.length-1];
};
//清空本队列
this.clear = function(){
items = [];
}
//获取队列指定位置
this.get = function(k){
return items[k];
};
//获取队列长度
this.length = function(){
return items.length;
};
//队列是否为空
this.empty = function(){
return items.length === 0;
};
}
var lazyQueue = new Queue();
lazyQueue.push({
a: 1,
b: 2
});
lazyQueue.push({
c: 3,
d: 4
});
console.log(lazyQueue.pop());
console.log(lazyQueue.length());
console.log(lazyQueue.clear());
console.log(lazyQueue.pop());
console.log(lazyQueue.length());
输出结果为:
{a: 1, b: 2}
1
undefined
undefined
0
队列的实践:
在我们的开发遇到很多队列的使用,且队列的应用也比较简单,只要在执行完上次任务后再执行本任务,直到队列为空为止。
之前分享了PHP以及JavaScript的八大排序方式,但是对于基数排序的JavaScript实现方法没有搞清楚,现在可以补上了。
首先将“基数排序”的概念理解一下: 基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。(取自百度百科)
我们同样以百度百科中的列子:假如有数字: 73, 22, 93, 43, 55, 14, 28, 65, 39, 81
经过基数排序第一次扫描之后按照个位数的大小排序,数字被分配大如下的盒子中:
第0个盒子:
第1个盒子:81
第2个盒子:22
第3个盒子:73, 93, 43
第4个盒子:14
第5个盒子:55, 65
第6个盒子:
第7个盒子:
第8个盒子:28
第9个盒子:39
根据盒子的顺序,对数字经行第一次排序的结果如下:
81, 22, 73, 93, 43, 14, 55, 65, 28, 39
然后根据十位上的数值再将上次排序结果分配到不同的盒子里
第0个盒子:
第1个盒子:14
第2个盒子:22, 28
第3个盒子:39
第4个盒子:43
第5个盒子:55
第6个盒子:65
第7个盒子:73
第8个盒子:81
第9个盒子:93
最后将盒子里的数字取出,组成一个新的列表,该列表即为排好顺序的数字:
14, 22, 28, 39 ,43, 55, 65, 73, 81, 93
使用队列代表盒子,可以实现这个算法,我们需要9个队列,每个对应一个数字。将所有队列保存在一个数组中,使用取余和出发操作决定各位和十位。算法的剩余部分将数字加入对应的队列,根据个位数值重新排序,然后再根据十位数值经行排序,结果即为排好顺序的数字。
function Queue(){
var items = [];
//入队
this.push = function(obj){
items.push(obj);
};
//出队
this.pop = function(){
return items.shift();
};
//获取队首
this.getFirst = function(){
return items[0];
};
//获取队尾
this.getLast = function(){
return items[items.length-1];
};
//清空本队列
this.clear = function(){
items = [];
}
//获取队列指定位置
this.get = function(k){
return items[k];
};
//获取队列长度
this.length = function(){
return items.length;
};
//队列是否为空
this.empty = function(){
return items.length == 0;
};
}
/********基数排序**********/
//初始化队列
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);
}
console.log('初始化数组:', nums);
//按照个位数字入相应的队列
for (var i=0; i<10; i++) {
queues[nums[i]%10].push(nums[i]);
}
//收集队列中的数字放在数组nums中
var j=0;
var nums2 = [];
for (var i=0; i<10; i++) {
while (!queues[i].empty()){
nums2[j++] = queues[i].pop();
}
}
console.log('个位数字入队排序后的数组:', nums2);
//由于上面已经全部出队了,所以可以使用已经初始化的queue队列数组
//按照十位数字入相应的队列
for (var i = 0; i < 10; i++) {
!isNaN(Math.floor(nums2[i] / 10)) && queues[Math.floor(nums2[i] / 10)].push(nums2[i]);
}
//收集队列中的数字放在数组nums中
j=0;
var nums3 = []
for (var i=0; i<10; i++) {
while (!queues[i].empty()){
nums3[j++] = queues[i].pop();
}
}
console.log('十位数字入队排序后的数组:', nums3);
结果如下:
初始化数组: [15, 48, 46, 77, 23, 72, 93, 25, 0, 75]
个位数字入队排序后的数组: [0, 72, 23, 93, 15, 25, 75, 46, 77, 48]
十位数字入队排序后的数组: [0, 15, 23, 25, 46, 48, 72, 75, 77, 93]
JavaScript中的数据结构及实战系列(1):队列的更多相关文章
- JavaScript中的数据结构及实战系列
本系列主要是讲解JavaScript中的数据结构及在实际项目中遇到的地方 JavaScript中的数据结构及实战系列(1):队列 JavaScript中的数据结构及实战系列(2):栈
- JavaScript中的数据结构及实战系列(2):栈
开题: 不冒任何险,什么都不做,什么也不会有,什么也不是. 本文目录 栈介绍: JavaScript实现栈: 栈的应用: 栈介绍: 和队列一样,栈也是一种表结构,但是和队列的"先进先出&qu ...
- JavaScript中async和await的使用以及队列问题
宏任务和微任务的队列入门知识,可以参考之前的文章: JavaScript的事件循环机制 宏任务和微任务在前端面试中,被经常提及到,包括口头和笔试题 async && await概念 a ...
- javascript中的数据结构
Javascript中的关键字 abstract continue finally instanceof private this boolean ...
- JavaScript中常见数据结构
数据结构 栈:一种遵从先进后出 (LIFO) 原则的有序集合:新添加的或待删除的元素都保存在栈的末尾,称作栈顶,另一端为栈底.在栈里,新元素都靠近栈顶,旧元素都接近栈底. 队列:与上相反,一种遵循先进 ...
- javascript实现数据结构与算法系列:队列 -- 链队列和循环队列实现及示例
1 队列的基本概念 队列(Queue):也是运算受限的线性表.是一种先进先出(First In First Out ,简称FIFO)的线性表.只允许在表的一端进行插入,而在另一端进行删除. 队首(fr ...
- JavaScript中的算法之美——栈、队列、表
序 最近花了比较多的时间来学习前端的知识,在这个期间也看到了很多的优秀的文章,其中Aaron可能在这个算法方面算是我的启蒙,在此衷心感谢Aaron的付出和奉献,同时自己也会坚定的走前人这种无私奉献的分 ...
- Web高级 JavaScript中的数据结构
复杂度分析 大O复杂度表示法 常见的有O(1), O(n), O(logn), O(nlogn) 时间复杂度除了大O表示法外,还有以下情况 最好情况时间复杂度 最坏情况时间复杂度 平均情况时间复杂度 ...
- 在Object-C中学习数据结构与算法之排序算法
笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速 ...
随机推荐
- JAVA: List用法
1.List中可以添加任何对象,包括自己定义的新的类. class Person{.....}上面定义了一个Person类,下面看好如何使用ListPerson p1=new Person();Per ...
- C#:求1到100的和
using System;public class Program { public static void Main() { ...
- 1121: [POI2008]激光发射器SZK
1121: [POI2008]激光发射器SZK Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 574 Solved: 475[Submit][Sta ...
- 1050: [HAOI2006]旅行comf
1050: [HAOI2006]旅行comf Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1495 Solved: 737[Submit][Sta ...
- 剑指offer_数组中的逆序对
题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P. 并将P对1000000007取模的结果输出. 即输出P%100 ...
- 从客户端中检测到有潜在危险的 Request.Form或Requst.String的值。
在ASP中客户端请求服务时会出现"从客户端中检测到有潜在危险的 Request.Form或Requst.QueryString的值.",原因是在web.config配置文件中存在这 ...
- Jmeter正则提取list中相同key的value和出现的次数
list中如何计算某个key出现的次数以及通过正则关联参数化呢? 首先要通过正则提取出现key的value 举例:
- .net core 部署 centos7 初试
最近抽时间搞搞.net core,这方面已经有很多先驱人物贡献了好多文章了,今天沿着前辈们走的坑自己再淌一下...... 注意开头说的使用centos7,我电脑之前全是6.几的版本,然后就一头雾水的搞 ...
- SQL server 数据库(视图、事物、分离附加、备份还原))
ql Server系列:视图.事物.备份还原.分离附加 视图是数据库中的一种虚拟表,与真实的表一样,视图包含一系列带有名称的行和列数据.行和列数据用来自定义视图的查询所引用的表,并且在引用视图时动态 ...
- Weexpack 使用教程
简介 weexpack 是 weex 新一代的工程开发套件,是基于weex快速搭建应用原型的利器.它能够帮助开发者通过命令行创建weex工程,添加相应平台的weex app模版,并基于模版从本地.Gi ...