棧的建立------用陣列實現棧
阿新 • • 發佈:2018-11-04
設計:
1、該陣列儲存物件型別在例項化是才確定-----泛型
2、陣列的索引0是棧底
3、建立一個正整數變數top ----是棧頂元素否後的索引號
4、建立一個棧的介面----定義如下函式:
程式碼實現:
介面類:StackADT
public interface StackADT <T> { /** * 壓棧 * @param t */ public void push(T t); /** * 彈棧 * 彈出棧頂元素,並移除 * @return * @throws EmptyCollectionException */ public T pop() throws EmptyCollectionException; /** * 彈出棧頂元素不移除 * @return * @throws EmptyCollectionException */ public T peek() throws EmptyCollectionException; /** * 判斷棧是否為空 * @return */ public boolean isEmpty(); /** * 棧當前儲存的大小 * @return */ public int size(); public String toString(); }
實現類:ArrayStack
/** * 用陣列建立棧 * * @author Administrator * * @param <T> */ public class ArrayStack<T> implements StackADT<T> { // 常量---儲存容量 private final int DEFAULT_CAPACITY = 100; // 棧頂表示 棧底----0 private int top; private T[] stack; /** * 預設容量 */ @SuppressWarnings("unchecked") public ArrayStack() { top = 0; stack = (T[]) new Object[DEFAULT_CAPACITY]; } /** * 指定容量 * * @param initCapacity */ @SuppressWarnings("unchecked") public ArrayStack(int initCapacity) { top = 0; stack = (T[]) new Object[initCapacity]; } @Override public void push(T t) { // 先判斷陣列是否已經滿了 if (size() == stack.length) { // 進行擴容 expandCapacity(); } stack[top] = t; top++; } /** * 為陣列擴容,實際就是 新建一個數組在將原來資料進行復制 */ private void expandCapacity() { stack = Arrays.copyOf(stack, stack.length * 2); } @Override public T pop() throws EmptyCollectionException { // 判斷陣列是否為空 if (isEmpty()) { throw new EmptyCollectionException("Stack"); } T result= stack[top - 1]; stack[top-1]=null;//彈出的值設定為null top--;//減少top計數器 return result; } @Override public T peek() throws EmptyCollectionException { // 判斷陣列是否為空 if (isEmpty()) { throw new EmptyCollectionException("Stack"); } return stack[top - 1]; } @Override public boolean isEmpty() { if (size() == 0) { return true; } return false; } @Override public int size() { return top; } /** * 測試 * @param args */ public static void main(String[] args) { StackADT<String> strs=new ArrayStack<String>(); try { strs.push("zhong"); String str=strs.peek(); System.out.println("strs.peek():"+str+" size:"+strs.size()); String str2=strs.pop(); System.out.println("strs.pop():"+str2+" size:"+strs.size()); } catch (EmptyCollectionException e) { e.printStackTrace(); } } }
異常類:EmptyCollectionException
public class EmptyCollectionException extends Exception {
public EmptyCollectionException(String message) {
super("The "+message+ " is empty.");
}
}