首先先了解一下栈的特性:
栈:stack,又称堆栈,它是运算受限的线性表,其限制是仅允许在表的一端进行插入和删除操作,不允许在其他任何位置进行添加、查找、删除等操作。
简单的说:采用该结构的集合,对元素的存取有如下的特点:
1.先进后出(即,存进去的元素,要在后它后面的元素依次取出后,才能取出该元素)。例如,子弹压进弹夹,先压进去的子弹在下面,后压进去的子弹在上面,当开枪时,先弹出上面的子弹,然后才能弹出下面的子弹。
2.栈的入口、出口的都是栈的顶端位置。
因为栈的操作会有异常的情况存在,所以自定义一个异常,继承于RuntimeException
/**
* 自定义当栈为空时进行操作时的异常
*/
public class StackEmptyException extends RuntimeException{
public StackEmptyException(String err){
super(err);
}
}
先定义一个栈的功能接口,方便操作
/**
* 定义栈常用功能的接口
*/
public interface Stack {
//返回栈中的元素个数
public int getSize();
//入栈
public void push(Object obj);
//出栈
public Object pop() throws StackEmptyException;
//去除栈顶元素
public Object peek() throws StackEmptyException;
//判断是否栈为空
public boolean isEmpty();
}
运用数组特性实现栈的顺序存储功能
/**
* 栈的顺序存储实现
*/
public class StackArray implements Stack{
private final int LEN=10; //定义栈的默认存储容量
private Object[] elements; //定义数据元素数组
private int top; //栈顶指针
//构造方法初始化数据
public StackArray() {
top=-1; //此时栈为空
elements=new Object[LEN];
}
//辅助方法,当栈的容量不够时进行扩容
public void escape(){
Object[] arr=new Object[LEN+10];
System.arraycopy(elements,0,arr,0,elements.length);
elements=arr;
}
//获取元素个数
@Override
public int getSize() {
return top+1;
}
//入栈
@Override
public void push(Object obj) {
if (getSize()>=elements.length) escape();
elements[++top]=obj;
}
//出栈
@Override
public Object pop() throws StackEmptyException {
if (getSize()<1)
throw new StackEmptyException("错误,栈中没有元素");
Object obj=elements[top];
elements[top--]=null;
return obj;
}
//取栈顶元素
@Override
public Object peek() throws StackEmptyException {
if (getSize()<1)
throw new StackEmptyException("错误,栈为空");
Object obj=elements[top];
return obj;
}
//判断栈是否为空
@Override
public boolean isEmpty() {
return top==-1;
}
}