Java棧——陣列實現
阿新 • • 發佈:2018-12-11
堆疊也有兩種基本的儲存結構:順序儲存結構和鏈式儲存結構,下面我們將用陣列實現棧的順序儲存結構。
當棧中沒有資料元素時稱為空棧;向一個棧插入元素又稱為進棧或入棧;從一個棧中刪
除元素又稱為出棧或退棧。由於棧的插入和刪除操作僅在棧頂進行,後進棧的元素必定先出
棧,所以又把堆疊稱為後進先出表(Last In First Out,簡稱 LIFO)。可以看做現實生活中排隊取錢,取號後排了老長一條隊伍,等1-2小時才到你,人家VIP直接特殊對待(咳咳,可以這樣理解吧!)
客官:小二,上程式碼!
小二:好嘞!
1.抽象一個棧介面
public interface Stack { //棧大小 public int size(); //棧是否為空 public boolean isEmploy(); //入棧 public void push(Object e); //出棧 public Object pop() throws StackEmptyException; //棧頂元素 public Object peek() throws StackEmptyException; }
2.自定義異常類
/*
* 棧為空時,出棧或者取棧頂元素異常
*/
public class StackEmptyException extends RuntimeException{
public StackEmptyException(String err){
super(err);
}
}
3.實現介面
public class StackArray implements Stack { // 棧初始大小 private final int LEN = 8; // 棧元素陣列 private Object[] elements; // 棧頂指標 private int top; public StackArray() { top = -1; elements = new Object[LEN]; } /* * 堆疊大小 */ public int size() { return top + 1; } /* * 判斷堆疊是否為空 */ public boolean isEmploy() { return top < 0; } /* * 元素e入棧 */ public void push(Object e) { if (size() >= elements.length) expandSpace();// 棧滿了,擴容 elements[++top] = e; } /* * 陣列滿了就擴容 */ public void expandSpace() { Object[] a = new Object[elements.length * 2]; for (int i = 0; i < a.length; i++) a[i] = elements[i]; elements = a; } /* * 棧頂元素出棧 */ public Object pop() throws StackEmptyException { if (size() < 1) throw new StackEmptyException("存錢罐是空的,怎麼出錢"); Object obj = elements[top]; elements[top--] = null; return obj; } /* * 返回棧頂元素 */ public Object peek() throws StackEmptyException { if (size() < 1) throw new StackEmptyException("存錢罐是空的,怎麼出錢"); return elements[top]; } }