一.什么是栈
栈是一种特殊的线性表,它只允许在固定的一端进行元素的添加与使用,且遵循先进后出的原则。添加取用元素的一端称为栈顶,另一端称为栈底。出栈和入栈都是操作栈顶元素
二.栈的模拟实现
栈的底层是一个数组
这是里面的成员变量以及构造方法
压栈(入栈)
首先要检测栈是否满,如果满,就要进行2倍扩容。注意,此扩容会产生新的对象!!!而不是在原数组上扩容。
出栈
遵循后进先出,所以要返回数组最后一个元素,而且要更新size的值。
这样对吗?显然没有考虑栈为空的情况,修改如下:
获取栈顶元素
三.Stack的使用
这里发现,Stack竟然没有数组来存放元素,这是因为,它用的是它的父类Vector的数组
入栈:
调用了父类的addElement方法:
要确定容量,容量不够就要扩容:
这里提到了capacityIncrement这个量,我们看一下这个量的解释:
这是一个容量增量,在扩容时,数组容量的增加量就是我们所指定的capacityIncrement的大小,而当没有指定这个量时,数组就会进行二倍扩容。
再继续看grow方法:
newcapacity的大小就是我上面说的,用它与mincapacity比较,选择其中的最大值进行扩容。注意,扩容是产生新的数组。
出栈:
调用了另一个方法:
首先检查下标合法性,然后将它之后的元素整体向前一定一位。注意将末尾位置置为空!!!
获取栈顶元素:
还是调用了另一个方法:
然后再用一个方法返回对应下标的元素:
用到了向下转型
返回某一元素的下标:
用到了一个方法:
先判断下表是否合法,再看o是否为null,否则走else语句
为什么要判断是否为null?因为只有不为null时才能调用equals方法!!!否则就会空指针异常