在之前基础的介绍中,我有写过一篇关于栈的内容(https://blog.csdn.net/weixin_45432742/article/details/99850913),介绍了栈以链表实现的方法和以以数组实现的方法,但是实现的栈将其存储的数据类型限制了,只能存储int类型的数据。在这里,再优化一下,加入泛型,并用顺序表实现一个栈结构,并且将其扩展,变成一个双端栈结构。
栈
栈是限定仅在表尾进行插入和删除操作的线性表,注意这里说的是表尾喔,是拿线性表实现的,线性表的表尾是从数组的头开始向后添加元素的。因此拿线性表去实现一个在栈顶操作的栈结构,在表尾进行操作比较方便(当然也可以从表尾向表头方向进行操作,都是一样的啦!)。下图是栈的操作示意图(再回顾一下下!)
其实栈本身也就是一个线性表,因为它的数据元素也具有线性关系,因为它的操作特殊,在栈顶进行操作,所以他是一种特殊的线性表。因为后进先出的特点,栈又可以被称为后进先出的线性表。
虽然是拿线性表实现的,但是它是栈的操作,因此有一个栈的接口(因为栈的操作受限,所以方法较List来说较少),如下类图和实现:
package 栈;
/**
* Stack是栈的接口
*
* */
public interface Stack<E> {
/**
* 获取栈中元素的个数
* @return 栈中的元素个数
* */
public int getSize();
/**
* 判断当前栈是否为空
* @return 是否为空布尔值
* */
public boolean isEmpty();
/**
* 进栈一个元素e
* @param e 即将进栈的元素
* */
public void push(E e);
/**
* 出栈一个元素
* @return 当前出栈的栈顶元素
* */
public E pop();
/**
* 获取当前栈顶元素
* @return 当前栈顶的元素 不弹栈
* */
public E peek();
/**
* 清空栈
* */
public void clear();
}
现在我们用我们写好的线性表(参考上一篇https://blog.csdn.net/weixin_45432742/article/details/100702745)中的方法实现栈的操作,在Stack接口下有一个子类叫ArrayStack,它是用数组,也可以说是线性表实现的。现在我们来看一下它的类图和具体实现: