目录
前言
栈是一种只能在一段经行插入或删除操作的线性表,在表中允许插入或删除的一端叫做栈顶,栈顶是动态的,通过一个称为栈顶指针的位置指示器来表示。表的另一端称为栈底。但栈中没有数据的时候称为空栈。表的插入操作叫做进栈或入栈。删除操作叫退栈或出栈。什么意思呢,说白了,栈就是个仅能同时通过一个人的洞,洞口就是栈顶,先进去的人会被后面的人堵住,只有等后面的人出去了,他才能出去。
由于栈中元素的逻辑关系与线性表相同,所有借鉴于线性表的储存结构又分为两种栈:顺序栈和链栈。
一、顺序栈
1.顺序栈的定义:
采用顺序储存的栈叫做顺序栈。顺序栈是用data<E>数组来存放栈中的元素,用一个整形变量top当作栈顶指针,指向栈顶。顺序栈有四个要素:
(1)栈空的条件为top==-1
(2)栈满的条件为top==capacity-1,如果栈满,通过扩容方法将栈的容量扩大为两倍
(3)元素e进栈的方式是将top加1,然后在data数组中的top位置处存放数据
(4)出栈操作是将top出的元素取出,然后将top减1
2.顺序栈的实现
定义一个栈,我们需要:
(1)一个存放数据的data<E>数组
(2)栈顶指针top
(3)final修饰的初始容量INITIAL
(4)表示当前容量的capacity。
因此,就有了以下的代码。
public class SqStackClass<E> {
final int INITIAL = 10;
private int capacity;
private E[] data;
private int top;
/**
* 构造函数
*/
public SqStackClass(){
data = (E[]) new Object[INITIAL ]; //初始化INITIAL长度的data数组,作为栈的储存工具
capacity = INICAPACITY;
top = -1; //顺序栈栈空的情况为top==-1
}
}
接下来是栈中方法的定义。栈通常有:push(E e),将元素e入栈;pop()将栈顶元素出栈;peek()获取栈顶元素但不出栈;判断是否为空栈isEmpty(),已经private修饰的扩容方法。
1)仅能在本类中使用的扩容方法
扩容方法很简单,就是创建一个新长度的数组,然后再将data指向新数组
/**
* 重新设置栈长度,仅供其他方法使用
* @param newCapacity
*/
private void updateCapacity(int newCapacity){
E[] newData = (E[]) new Object[newCapacity];
for (