1. 程式人生 > >Java棧——陣列實現

Java棧——陣列實現

  堆疊也有兩種基本的儲存結構:順序儲存結構和鏈式儲存結構,下面我們將用陣列實現棧的順序儲存結構。

當棧中沒有資料元素時稱為空棧;向一個棧插入元素又稱為進棧或入棧;從一個棧中刪

除元素又稱為出棧或退棧。由於棧的插入和刪除操作僅在棧頂進行,後進棧的元素必定先出

棧,所以又把堆疊稱為後進先出表(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];
	}

}