首先先了解一下棧的特性:
棧: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;
}
}