JavaScript数组实现数据结构中的队列与堆栈


Posted in Javascript onMay 26, 2016

一、队列和堆栈的简单介绍

1.1、队列的基本概念

队列:是一种支持先进先出(FIFO)的集合,即先被插入的数据,先被取出!

如下图所示:

JavaScript数组实现数据结构中的队列与堆栈

1.2、堆栈的基本概念

堆栈:是一种支持后进先出(LIFO)的集合,即后被插入的数据,先被取出!

如下图所示:

JavaScript数组实现数据结构中的队列与堆栈

二、 在JavaScript中实现队列和堆栈

在JavaScript中实现队列和数组主要是通过数组,js数组中提供了以下几个方法可以让我们很方便实现队列和堆栈:

•shift:从数组中把第一个元素删除,并返回这个元素的值。

•unshift: 在数组的开头添加一个或更多元素,并返回新的长度

•push:在数组的中末尾添加元素,并返回新的长度

•pop:从数组中把最后一个元素删除,并返回这个元素的值。

2.1、实现队列

<script type="text/javascript">
//创建一个数组来模拟队列
var a=new Array();
console.log(a);
//unshift: 在数组的开头添加一个或更多元素,并返回新的长度
console.log("入队");
a.unshift()
console.log(a);//----->
a.unshift();
console.log(a);//----->,
a.unshift();
console.log(a);//----->,,
a.unshift();
console.log(a);//----->,,,
console.log("出队,先进先出");
console.log(a);
//pop:从数组中把最后一个元素删除,并返回这个元素的值
a.pop();//----->
console.log(a);
a.pop();//----->
console.log(a);
a.pop();//----->
console.log(a);
a.pop();//----->
console.log(a);
</script>

在google浏览器控制台输出的效果如下图所示:

JavaScript数组实现数据结构中的队列与堆栈

2.2、实现堆栈

<script type="text/javascript">
//创建一个数组来模拟堆栈
var a=new Array();
console.log(a);
//push: 在数组的末尾添加一个或更多元素,并返回新的长度
console.log("入栈");
a.push()
console.log(a);//----->
a.push();
console.log(a);//----->,
a.push();
console.log(a);//----->,,
a.push();
console.log(a);//----->,,,
console.log("出栈,后进先出");
console.log(a);
//pop:从数组中把最后一个元素删除,并返回这个元素的值
a.pop();//----->
console.log(a);
a.pop();//----->
console.log(a);
a.pop();//----->
console.log(a);
a.pop();//----->
console.log(a);
</script>

在google浏览器控制台输出的效果如下图所示:

JavaScript数组实现数据结构中的队列与堆栈

2.3、push方法和unshift方法的性能测试

Array的push与unshift方法都能给当前数组添加元素,不同的是,push是在末尾添加,而unshift则是在开头添加,从原理就可以知道,unshift的效率是较低的。原因是,它每添加一个元素,都要把现有元素往下移一个位置。但到底效率差异有多大呢?下面来简单测试一下。

<script type="text/javascript">
/*
关于代码中"var s=+newDate();"的技巧说明
解释如下:=+这个运算符是不存在的;
+相当于.valueOf();
+new Date()相当于new Date().valueOf()
//个结果一样返回当前时间的毫秒数
alert(+new Date());
alert(+new Date);
var s=new Date();
alert(s.valueOf());
alert(s.getTime());
*/
var arr = [ ];
var startTime = +new Date(); //+new Date()相当于new Date().valueOf(),返回当前时间的毫秒数
// push性能测试 
for (var i = ; i < ; i++) { 
arr.push(i); 
}
var endTime = +new Date();
console.log("调用push方法往数组中添加个元素耗时"+(endTime-startTime)+"毫秒"); 
startTime = +new Date(); 
arr = [ ]; 
// unshift性能测试 
for (var i = ; i < ; i++) { 

arr.unshift(i); 
}
endTime = +new Date();
console.log("调用unshift方法往数组中添加个元素耗时"+(endTime-startTime)+"毫秒"); 
</script>

这段代码分别执行了100000次push和unshift操作,在Google浏览器运行一次,得到的结果如下图所示:

JavaScript数组实现数据结构中的队列与堆栈

可见,unshift比push要慢差不多100倍!因此,平时还是要慎用unshift,特别是对大数组。那如果一定要达到unshift的效果,可以借助于Array的reverse方法,Array的reverse的方法能够把一个数组反转。先把要放进数组的元素用push添加,再执行一次reverse,就达到了unshift的效果。比如:

<script type="text/javascript">
//创建一个数组来模拟堆栈
var a=new Array();
//使用push方法在数组的末尾添加元素
a.push()
a.push();
a.push();
a.push();
console.log("数组反转之前数组中的元素顺序");
console.log(a);//----->,,,
//Array有一个叫做reverse的方法,能够把一个数组反转。先把要放进数组的元素用push添加,再执行一次reverse,就达到了unshift的效果
a.reverse();//使用reverse方法将数组进行反转
console.log("数组反转之后数组中的元素顺序");
console.log(a);
</script>

在google浏览器控制台输出的效果如下图所示:

JavaScript数组实现数据结构中的队列与堆栈

从运行结果来看,数组元素的顺序已经反转过来了。

2.4、reverse方法的性能测试

reverse的性能又如何呢,下面再来测试:

<script type="text/javascript">
var arr = [ ], s = +new Date; 
for (var i = ; i < ; i++) { 
 arr.push(i); 
}
//调用reverse方法将数组里面的元素的顺序反转
arr.reverse(); 
console.log("调用reverse方法将数组里面的元素的顺序反转耗时:"+(+new Date - s)+"毫秒");
</script>

在google浏览器控制台输出的效果如下图所示:

JavaScript数组实现数据结构中的队列与堆栈

从运行效果中可以看到,reverse方法的性能极高,可以放心使用。

以上就是关于在javascript中通过数组来实现队列和堆栈的总结,并且简单测试了一下push、unshift、reverse这几个方法在操作大数组方面的性能优劣。

以上所述是小编给大家介绍的JavaScript数组实现数据结构中的队列与堆栈,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
javascript 类型判断代码分析
Mar 28 Javascript
基于jQuery的js分页代码
Jun 10 Javascript
js预载入和JavaScript Image()对象使用介绍
Aug 28 Javascript
Javascript查询DBpedia小应用实例学习
Mar 07 Javascript
Jquery实现点击切换图片并隐藏显示内容(2种方法实现)
Apr 11 Javascript
jQuery之按钮组件的深入解析
Jun 19 Javascript
js根据日期判断星座的示例代码
Jan 23 Javascript
jquery 构造函数在表单提交过程中修改数据
May 25 Javascript
EditPlus 正则表达式 实战(3)
Dec 15 Javascript
vue2.0 可折叠列表 v-for循环展示的实例
Sep 07 Javascript
JavaScript实现美化滑块效果
May 17 Javascript
Vue实现圆环进度条的示例
Feb 06 Vue.js
jquery获取复选框checkbox的值的简单实现方法
May 26 #Javascript
jquery判断checkbox是否选中及改变checkbox状态的实现方法
May 26 #Javascript
jquery获取所有选中的checkbox实现代码
May 26 #Javascript
JQuery点击行tr实现checkBox选中的简单实例
May 26 #Javascript
动态加载js、css的简单实现代码
May 26 #Javascript
JS hashMap实例详解
May 26 #Javascript
jQuery验证插件validate使用方法详解
Sep 13 #Javascript
You might like
PHP 动态随机生成验证码类代码
2010/04/09 PHP
PHP中文件读、写、删的操作(PHP中对文件和目录操作)
2012/03/06 PHP
用jquery来定位
2007/02/20 Javascript
JavaScript 10件让人费解的事情
2010/02/15 Javascript
js 替换功能函数,用正则表达式解决,js的全部替换
2010/12/08 Javascript
Javascript显示和隐藏ul列表的方法
2015/07/15 Javascript
每天一篇javascript学习小结(属性定义方法)
2015/11/19 Javascript
用JS中split方法实现彩色文字背景效果实例
2016/08/24 Javascript
深入理解JavaScript中的并行处理
2016/09/22 Javascript
Canvas实现放射线动画效果
2017/02/15 Javascript
Linux CentOS系统下安装node.js与express的方法
2017/04/01 Javascript
node文件上传功能简易实现代码
2017/06/16 Javascript
JavaScript实现快速排序的方法分析
2018/01/10 Javascript
解决vue-cli3 使用子目录部署问题
2018/07/19 Javascript
详解Vue.directive 自定义指令
2019/03/27 Javascript
Vue 之孙组件向爷组件通信的实现
2019/04/23 Javascript
Vue自定义组件的四种方式示例详解
2020/02/28 Javascript
[43:32]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS NewBee第一场
2014/05/26 DOTA
Python编写的com组件发生R6034错误的原因与解决办法
2013/04/01 Python
fastcgi文件读取漏洞之python扫描脚本
2017/04/23 Python
Python 多进程并发操作中进程池Pool的实例
2017/11/01 Python
Python Process多进程实现过程
2019/10/22 Python
Python 安装 virturalenv 虚拟环境的教程详解
2020/02/21 Python
使用Django清空数据库并重新生成
2020/04/03 Python
python 画条形图(柱状图)实例
2020/04/24 Python
HTML+CSS3模拟心的跳动实例代码
2017/09/05 HTML / CSS
Tory Burch德国官网:美国时尚生活品牌
2018/01/03 全球购物
澳大利亚儿童鞋在线:The Trybe
2019/07/16 全球购物
日本酒店、民宿、温泉旅馆、当地旅行团中文预订:e路东瀛
2019/12/09 全球购物
学习十八大精神心得体会
2013/12/31 职场文书
银行优秀员工推荐信
2015/03/24 职场文书
人事任命通知书
2015/04/21 职场文书
Nginx 根据URL带的参数转发的实现
2021/04/01 Servers
Golang标准库syscall详解(什么是系统调用)
2021/05/25 Golang
让文件路径提取变得更简单的Python Path库
2021/05/27 Python
Python-OpenCV教程之图像的位运算详解
2021/06/21 Python