1. 程式人生 > >棧的建立------用陣列實現棧

棧的建立------用陣列實現棧

設計:

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.");
	}

}