本文详解如何利用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数组实现数据结构中的队列与堆栈,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对本站网站的支持!