# JavaScript 模拟堆栈和队列操作的方法

**URL:** <https://www.isharkfly.com/t/javascript/8525>\
**Category:** 前端\
**Created:** [October 23, 2012, 2:29am UTC](https://www.isharkfly.com/t/javascript/8525 "2012-10-23T02:29:55Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![honeymoose](https://www.isharkfly.com/user_avatar/www.isharkfly.com/honeymoose/32/20796_2.png) [@honeymoose](https://www.isharkfly.com/u/honeymoose)\
**Post date:** [October 23, 2012, 2:29am UTC](https://www.isharkfly.com/t/javascript/8525/1 "2012-10-23T02:29:55Z")

</div>

为实现数组的动态操作，从JavaScript 1.2+和JScript 5.5+开始，Array 对象提供了诸如pop()、push()、unshift()、shift()等方法来动态添加和删除数组元素。

先来了解两个抽象的数据类型：

堆栈（LIFO）：用于以“后进先出”的顺序存储数据的结构。在读取堆栈的时候，最后存入的数据最先被读取出来；

队列（FIFO）：用于以“先进先出”的顺序储存数据的结构。在读取队列的时候，最先存入的数据最先被读取出来。

其中 pop()方法模拟堆栈的“压栈”动作，将数组中最后一个元素删除，并将该元素作为操作的结果返回，同时更新数组的length 属性；

push()方法模拟堆栈的“出栈”动作，将以参数传入的元素按参数顺序添加到数组的尾部，并将插入的元素作为操作的结果返回，同时更新数组的length 属性。

unshift()、shift()方法与pop()、push()方法相对，都是删除和添加数组元素，仅仅是删除和添加目标的位置不同，前者与后者相反方向，即从数组的第一个元素开始操作，后面的元素将分别向前和向后移动，数组的length 属性自动更新。

考察如下的代码：[code]\<! DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0//EN”  
“[http://www.w3.org/TR/REC-html140/strict.dtd](http://www.w3.org/TR/REC-html140/strict.dtd)”\>

Sample Page!   
 [/code]程序运行结果如图所示。

![](https://www.isharkfly.com/images/transparent.png)

Array 对象提供的模拟堆栈和队列进行数组元素添加、删除的方法，使用非常简单。

它致命的缺陷就是只能操作数组的头部或末端的数组元素，不能进行任意位置数组元素的添加和删除操作，下面介绍可以在数组中任意位置执行该操作的splice()方法。

注意：Array 对象的pop()、push()、unshift()、shift()等添加和删除数组元素的方法，虽模拟了堆栈和队列的基本动作，但并不能因此而将数组看成堆栈或队列。
