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 相关文章推荐
繁简字转换功能
Jul 19 Javascript
FusionCharts图表显示双Y轴双(多)曲线
Nov 22 Javascript
JS中判断null的方法分析
Nov 21 Javascript
JavaScript 完成注册页面表单校验的实例
Aug 19 Javascript
ES6中Array.copyWithin()函数的用法实例详解
Sep 16 Javascript
JavaScript适配器模式详解
Oct 19 Javascript
jQuery实现的老虎机跑动效果示例
Dec 29 jQuery
vue增加强缓存和版本号的实现方法
May 01 Javascript
vue项目初始化到登录login页面的示例
Oct 31 Javascript
24个解决实际问题的ES6代码片段(小结)
Feb 02 Javascript
微信小程序点击滚动到指定位置的实现
May 22 Javascript
详解如何使用React Hooks请求数据并渲染
Oct 18 Javascript
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
中国的第一台收音机
2021/03/01 无线电
PHP遍历数组的三种方法及效率对比分析
2015/02/12 PHP
使用PHP实现下载CSS文件中的图片
2015/12/06 PHP
php中curl和soap方式请求服务超时问题的解决
2018/06/11 PHP
使用EXT实现无刷新动态调用股票信息
2008/11/01 Javascript
JS正则中的RegExp对象对象
2012/11/07 Javascript
IE 下Enter提交表单存在重复提交问题的解决方法
2014/05/04 Javascript
AngularJS入门心得之directive和controller通信过程
2016/01/25 Javascript
Bootstrap3制作图片轮播效果
2016/05/12 Javascript
JavaScript每天必学之基础知识
2016/09/17 Javascript
如何使用jquery实现文字上下滚动效果
2016/10/12 Javascript
浅谈react.js中实现tab吸顶效果的问题
2017/09/06 Javascript
Angular自定义组件实现数据双向数据绑定的实例
2017/12/11 Javascript
js实现一个简单的MVVM框架示例
2018/01/15 Javascript
仿iPhone通讯录制作小程序自定义选择组件的实现
2019/05/23 Javascript
微信小程序引入模块中wxml、wxss、js的方法示例
2019/08/09 Javascript
Layui实现数据表格中鼠标悬浮图片放大效果,离开时恢复原图的方法
2019/09/11 Javascript
nodejs中使用archive压缩文件的实现代码
2019/11/26 NodeJs
pandas 实现将重复表格去重,并重新转换为表格的方法
2018/04/18 Python
基于随机梯度下降的矩阵分解推荐算法(python)
2018/08/31 Python
对python函数签名的方法详解
2019/01/22 Python
基于python全局设置id 自动化测试元素定位过程解析
2019/09/04 Python
详解Python的三种拷贝方式
2020/02/11 Python
Jupyter Notebook折叠输出的内容实例
2020/04/22 Python
python实现简单的五子棋游戏
2020/09/01 Python
Python读取多列数据以及用matplotlib制作图表方法实例
2020/09/23 Python
电焊工工作岗位职责
2014/02/06 职场文书
小学生中国梦演讲稿
2014/04/23 职场文书
2014年党员个人剖析材料
2014/10/08 职场文书
护林员个人总结
2015/03/04 职场文书
婚庆司仪开场白
2015/05/29 职场文书
小学中队长竞选稿
2015/11/20 职场文书
《亲亲我的妈妈》观后感(3篇)
2019/09/26 职场文书
html实现随机点名器的示例代码
2021/04/02 Javascript
sql通过日期判断年龄函数的示例代码
2021/07/16 SQL Server
Windows和Linux上部署Golang并运行程序
2022/04/22 Servers