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 相关文章推荐
SharePoint 客户端对象模型 (一) ECMA Script
May 22 Javascript
jquery ajax同步异步的执行最终解决方案
Apr 26 Javascript
js实现在字符串中提取数字
Nov 05 Javascript
jQuery自定义添加&quot;$&quot;与解决&quot;$&quot;冲突的方法
Jan 19 Javascript
jQuery插件Validation快速完成表单验证的方式
Jul 28 Javascript
jQuery如何封装输入框插件
Aug 19 Javascript
WEB前端实现裁剪上传图片功能
Oct 17 Javascript
实例分析浏览器中“JavaScript解析器”的工作原理
Dec 12 Javascript
详解Node.js中path模块的resolve()和join()方法的区别
Oct 29 Javascript
vue2.0 如何在hash模式下实现微信分享
Jan 22 Javascript
JavaScript DOM常用操作代码汇总
Jul 03 Javascript
利用Vue的v-for和v-bind实现列表颜色切换
Jul 17 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
PHP入门速成(2)
2006/10/09 PHP
ip签名探针
2006/10/09 PHP
PHP 工厂模式使用方法
2010/05/18 PHP
PHP中用接口、抽象类、普通基类实现“面向接口编程”与“耦合方法”简述
2011/03/23 PHP
php 操作调试的方法
2012/07/12 PHP
一款简单实用的php操作mysql数据库类
2014/12/08 PHP
PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】
2017/07/21 PHP
JS网页图片按比例自适应缩放实现方法
2014/01/15 Javascript
通过js为元素添加多项样式,浏览器全兼容写法
2014/08/30 Javascript
jQuery实现文本框输入同步的方法
2015/06/20 Javascript
js学习阶段总结(必看篇)
2016/06/16 Javascript
DOM操作原生js 的bug,使用jQuery 可以消除的解决方法
2016/09/04 Javascript
BootStrap给table表格的每一行添加一个按钮事件
2017/09/07 Javascript
JavaScript实现删除数组重复元素的5种常用高效算法总结
2018/01/18 Javascript
vue中使用gojs/jointjs的示例代码
2018/08/24 Javascript
vue-router 手势滑动触发返回功能
2018/09/30 Javascript
玩转Koa之koa-router原理解析
2018/12/29 Javascript
微信小程序获取复选框全选反选选中的值(实例代码)
2019/12/17 Javascript
vue3.0实现点击切换验证码(组件)及校验
2020/11/18 Vue.js
Selenium执行JavaScript脚本的方法示例
2020/12/31 Javascript
python自动化测试实例解析
2014/09/28 Python
Django中日期处理注意事项与自定义时间格式转换详解
2018/08/06 Python
使用python画社交网络图实例代码
2019/07/10 Python
PyCharm刷新项目(文件)目录的实现
2020/02/14 Python
Python标准库:内置函数max(iterable, *[, key, default])说明
2020/04/25 Python
解决python运行启动报错问题
2020/06/01 Python
CSS Grid布局教程之网格单元格布局
2014/12/30 HTML / CSS
Java的基础面试题附答案
2016/01/10 面试题
煤矿班组长岗位职责
2013/12/29 职场文书
省级优秀毕业生主要事迹
2014/05/29 职场文书
机电专业毕业生求职信
2014/07/01 职场文书
公司委托书格式
2014/08/01 职场文书
机关党建工作汇报材料
2014/08/20 职场文书
实习证明格式范文
2014/10/14 职场文书
财政局个人年终总结
2015/03/03 职场文书
Docker部署Mysql8的实现步骤
2022/07/07 Servers