其实说到底,在js中栈更像是一种变种的数组,只是没有数组那么多的方法,也没有数组那么灵活。但是栈和队列这两种数据结构比数组更加的高效和可控。而在js中要想模拟栈,依据的主要形式也是数组。
从这篇文章开始,可能会接触到一些原型,原型链,类,构造函数等相关的js概念,但是这里并不会过多的介绍这些概念,必要的时候会进行一些简要的说明,推荐大家去看看汤姆大叔的深入理解Javascript系列,王福朋大神的深入理解Javascript原型和闭包系列。都是极为不错的深度好文,推荐大家可以深入学习。
要想实现一个数据结构,首先你要明白它的基本原理,那么栈是什么?又是如何工作的呢?
栈(stack)是一种遵循后进先出(Last In First Out)原则的有序集合。新添加的元素和待删除的元素都保存在栈的同一端,称为栈顶,另一端就叫做栈底。在栈里,新元素都接近栈顶,旧元素都靠近栈底。其实可以把栈简单理解成往一个木桶里堆叠的放入物品,最后放进去的在桶的顶端,也是可以最先拿出来的,而最先放进去的却在桶的底部,只有把所有上面的物品拿出来之后才可以拿走底部的物品。
对于数组来说,可以添加元素,删除元素,获取数组的长度以及返回对应下标得到值,那么在开始构造一个栈之前,我们需要了解一下栈都有哪些基本操作。
1、压栈,也称之为入栈,也就是把元素加入栈中。就像是数组中的push一样。
2、出栈,移除栈顶的元素。就像是数组中的pop一样。
3、获取栈顶的元素,不对栈做任何其他操作。就像是在数组中通过下标获取对应的值一样。
4、判断栈是否为空。就像是判断数组的长度是否为0一样。
5、清空栈,也就是移除栈里的所有元素。就像是把数组的长度设置为0一样。
6、获取栈里的元素个数。就像是数组的length属性一样。
那么,我相信我大家已经对栈有了一个基本的了解,那么我们接下来就看看如何通过构造函数来实现一个自己的js栈。
function Stack () { var items = []; //首先,我们来实现一个入栈的方法,这个方法负责往栈里加入元素,要注意的是,该方法只能添加元素到栈顶,也就是栈的尾部。 this.push = function (ele) { items.push(ele) } } var stack = new Stack();