JavaScript数组实现队列与堆栈及性能优化

作者:听澜

时间:2026-10-30

浏览:393

本文详解如何利用JavaScript数组模拟队列(FIFO)与堆栈(LIFO)数据结构。通过对比push、unshift及reverse方法的执行效率,指出unshift在大数组操作中的性能瓶颈,并推荐结合push与reverse实现高效入队,为前端开发提供实用的数据结构优化方案。

文章目录

队列与堆栈基本概念

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

1.1、队列的基本概念

队列是一种遵循先进先出(FIFO)原则的数据集合,即最早插入的数据项将最先被移除。

如下图所示:

队列与堆栈基本概念

1.2、堆栈的基本概念

堆栈是一种遵循后进先出(LIFO)原则的数据集合,即最后插入的数据项将最先被移除。

如下图所示:

  队列与堆栈基本概念

JavaScript数组实现队列与堆栈

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

在JavaScript中,我们可以利用数组来构建队列和堆栈。JavaScript数组内置了以下方法,可便捷地实现这两种数据结构的操作:

•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浏览器控制台输出的效果如下图所示:

  队列与堆栈基本概念

堆栈的实现

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浏览器控制台输出的效果如下图所示:

队列与堆栈基本概念

push与unshift性能测试

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浏览器运行一次,得到的结果如下图所示:

队列与堆栈基本概念

可见,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浏览器控制台输出的效果如下图所示:

队列与堆栈基本概念

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

reverse方法性能测试

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浏览器控制台输出的效果如下图所示:

队列与堆栈基本概念

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

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

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

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章