今天在项目中要使用JavaScript实现数据结构中的队列和堆栈,这里做一下总结。

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

1.1、队列的基本概念

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

  如下图所示:

  

1.2、堆栈的基本概念

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

  如下图所示:

  

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

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

  • shift:从数组中把第一个元素删除,并返回这个元素的值。
  • unshift: 在数组的开头添加一个或更多元素,并返回新的长度
  • push:在数组的中末尾添加元素,并返回新的长度
  • pop:从数组中把最后一个元素删除,并返回这个元素的值。

2.1、实现队列

 1 <script type="text/javascript">
2 //创建一个数组来模拟队列
3 var a=new Array();
4 console.log(a);
5 //unshift: 在数组的开头添加一个或更多元素,并返回新的长度
6 console.log("入队");
7 a.unshift(1)
8 console.log(a);//----->1
9 a.unshift(2);
10 console.log(a);//----->2,1
11 a.unshift(3);
12 console.log(a);//----->3,2,1
13 a.unshift(4);
14 console.log(a);//----->4,3,2,1
15 console.log("出队,先进先出");
16 console.log(a);
17 //pop:从数组中把最后一个元素删除,并返回这个元素的值
18 a.pop();//----->1
19 console.log(a);
20 a.pop();//----->2
21 console.log(a);
22 a.pop();//----->3
23 console.log(a);
24 a.pop();//----->4
25 console.log(a);
26 </script>

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

  

2.2、实现堆栈

 1 <script type="text/javascript">
2 //创建一个数组来模拟堆栈
3 var a=new Array();
4 console.log(a);
5 //push: 在数组的末尾添加一个或更多元素,并返回新的长度
6 console.log("入栈");
7 a.push(1)
8 console.log(a);//----->1
9 a.push(2);
10 console.log(a);//----->1,2
11 a.push(3);
12 console.log(a);//----->1,2,3
13 a.push(4);
14 console.log(a);//----->1,2,3,4
15 console.log("出栈,后进先出");
16 console.log(a);
17 //pop:从数组中把最后一个元素删除,并返回这个元素的值
18 a.pop();//----->4
19 console.log(a);
20 a.pop();//----->3
21 console.log(a);
22 a.pop();//----->2
23 console.log(a);
24 a.pop();//----->1
25 console.log(a);
26 </script>

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

  

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

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

 1 <script type="text/javascript">
2 /*
3 关于代码中"var s=+newDate();"的技巧说明
4 解释如下:=+这个运算符是不存在的;
5 +相当于.valueOf();
6 +new Date()相当于new Date().valueOf()
7 //4个结果一样返回当前时间的毫秒数
8 alert(+new Date());
9 alert(+new Date);
10 var s=new Date();
11 alert(s.valueOf());
12 alert(s.getTime());
13 */
14 var arr = [ ];
15 var startTime = +new Date(); //+new Date()相当于new Date().valueOf(),返回当前时间的毫秒数
16 // push性能测试
17 for (var i = 0; i < 100000; i++) {
18   arr.push(i);
19 }
20 var endTime = +new Date();
21 console.log("调用push方法往数组中添加100000个元素耗时"+(endTime-startTime)+"毫秒");
22
23 startTime = +new Date();
24 arr = [ ];
25 // unshift性能测试
26 for (var i = 0; i < 100000; i++) {
27   arr.unshift(i);
28 }
29 endTime = +new Date();
30 console.log("调用unshift方法往数组中添加100000个元素耗时"+(endTime-startTime)+"毫秒");
31 </script>

  这段代码分别执行了100000次push和unshift操作,在Google浏览器运行一次,得到的结果如下图所示:
  
  可见,unshift比push要慢差不多100倍!因此,平时还是要慎用unshift,特别是对大数组。那如果一定要达到unshift的效果,可以借助于Array的reverse方法,Array的reverse的方法能够把一个数组反转。先把要放进数组的元素用push添加,再执行一次reverse,就达到了unshift的效果。比如:

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

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

  

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

2.4、reverse方法的性能测试

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

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

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

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

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

JavaScript学习总结(二十一)——使用JavaScript的数组实现数据结构中的队列与堆栈的更多相关文章

  1. 使用JavaScript的数组实现数据结构中的队列与堆栈

    今天在项目中要使用JavaScript实现数据结构中的队列和堆栈,这里做一下总结. 一.队列和堆栈的简单介绍 1.1.队列的基本概念 队列:是一种支持先进先出(FIFO)的集合,即先被插入的数据,先被 ...

  2. JavaScript学习记录二

    title: JavaScript学习记录二 toc: true date: 2018-09-13 10:14:53 --<JavaScript高级程序设计(第2版)>学习笔记 要多查阅M ...

  3. python3.4学习笔记(二十一) python实现指定字符串补全空格、前面填充0的方法

    python3.4学习笔记(二十一) python实现指定字符串补全空格.前面填充0的方法 Python zfill()方法返回指定长度的字符串,原字符串右对齐,前面填充0.zfill()方法语法:s ...

  4. 学习笔记:CentOS7学习之二十一: 条件测试语句和if流程控制语句的使用

    目录 学习笔记:CentOS7学习之二十一: 条件测试语句和if流程控制语句的使用 21.1 read命令键盘读取变量的值 21.1.1 read常用见用法及参数 21.2 流程控制语句if 21.2 ...

  5. 二十一、contextMap中放的常用数据

    二十一.contextMap中放的常用数据 request:请求范围的数据.即ServletRequest中的那个Map parameters:请求参数的数据.即request.getParamete ...

  6. Python学习(二十一) —— 前端之JavaScript

    转载自http://www.cnblogs.com/liwenzhou/p/8004649.html 一.JavaScript概述 1.JavaScript的历史 1992年Nombas开发出C-mi ...

  7. Javascript学习笔记二——操作DOM

    Javascript学习笔记 DOM操作: 一.GetElementById() ID在HTML是唯一的,getElementById()可以定位唯一的一个DOM节点 二.querySelector( ...

  8. JavaScript学习笔记(十一)——闭包

    在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...

  9. JavaScript学习总结(二)——延迟对象、跨域、模板引擎、弹出层、AJAX示例

    一.AJAX示例 AJAX全称为“Asynchronous JavaScript And XML”(异步JavaScript和XML) 是指一种创建交互式网页应用的开发技术.改善用户体验,实现无刷新效 ...

随机推荐

  1. kitkat-s5p4418drone 记录

      查看帮助: ./device/nexell/tools/build.sh  -h   编译u-boot: ./device/nexell/tools/build.sh -b drone2 -t u ...

  2. installEventFilter可以安装到任何QObject的子类,并不仅仅是UI组件。事件过滤器和安装过滤器的组件必须在同一线程,在它们分属在不同线程时,事件过滤器也是不起作用的

    Qt的事件知识点: ①事件对象创建完毕后,Qt 将这个事件对象传递给 QObject 的 event() 函数.event() 函数并不直接处理事件,而是将这些事件对象按照它们不同的类型,分发给不同的 ...

  3. busybox,alphine,ubuntu,centos/fedore操作系统

    在docker 中搜索busybox   docker search busybox 之后我们运行一下这个系统 Alpine操作系统 3.ubuntu 之前一直都安装过,这里不再多叙述 当时用apt- ...

  4. day15(Mysql学习)

      day15-MySQL   数据库   1 数据库概念(了解) 1.1 什么是数据库 数据库就是用来存储和管理数据的仓库! 数据库存储数据的优先: 可存储大量数据: 方便检索: 保持数据的一致性. ...

  5. python笔记9-多线程Threading之阻塞(join)和守护线程(setDaemon)

    python笔记9-多线程Threading之阻塞(join)和守护线程(setDaemon) 前言 今天小编YOYO请xiaoming和xiaowang吃火锅,吃完火锅的时候会有以下三种场景: - ...

  6. (1.3)DML增强功能-Apply、pivot、unpivot、for xml path行列转换

    深入了解行列转换请参考另一篇文章:https://www.cnblogs.com/gered/p/9271581.html 总结: 1.apply一般形式 --基本形式 SELECT a FROM d ...

  7. centos HA高可用集群 heartbeat搭建 heartbeat测试 主上停止heartbeat服务 测试脑裂 两边都禁用ping仲裁 第三十二节课

    centos   HA高可用集群  heartbeat搭建 heartbeat测试  主上停止heartbeat服务  测试脑裂  两边都禁用ping仲裁  第三十二节课 heartbeat是Linu ...

  8. centos linux系统日常管理3 服务管理ntsysv,chkconfig,系统日志rsyslog,last ,lastb ,exec,xargs,dmesg,screen,nohup,curl,ping ,telnet,traceroute ,dig ,nc,nmap,host,nethogs 第十六节课

    centos linux系统日常管理3  服务管理ntsysv,chkconfig,系统日志rsyslog,last ,lastb ,exec,xargs,dmesg,screen,nohup,cur ...

  9. windos 查看指定端口,将指定进程杀死

    >netstat -aon | findstr “80″ Proto   Local Address           Foreign Address         State        ...

  10. ubuntu 用法

    1:改变某一个目录的拥有者 sudo chown -hR user:user ./目录名    //     user:user  用户名:组名 sudo chmod  777 文件     //给文 ...