棧---數組實現

棧的抽象類型描述(ADT):

package org.zp.datastruct;

public interface Stack {
	// Stack values are stacks whose elements are arbitrary objects.
	// 棧元素類型爲任意對象
	
	//Modifiers 修改器--修改棧
	public void clear();
	public void push(Object obj);
	public Object pop();	// 刪除並返回棧頂元素
	
	//Accessors 訪問器--獲取棧信息
	public boolean isEmpty();
	public int size();
	public Object peek();	// 返回棧頂元素
	
}
棧的數組實現:

package org.zp.datastruct;

// 數組實現棧
public class ArrayStack implements Stack {
	
	private static final int DEFAULT_SIZE = 10;		// 指定--默認棧深度
	private Object[] array;
	private int top;	// 指向棧頂指針/遊標
	
//	public ArrayStack(){}
	
	public ArrayStack() {	// 初始化
		array = new Object[DEFAULT_SIZE];
		top = 0;
	}

	@Override
	public void clear() {
		for(int i = 0; i < top; i++) {
			array[i] = null;
		}
//		for(Object i:array) {
//			i = null;
//		}
		top = 0;
	}

	@Override
	public boolean isEmpty() {
		return top == 0;
	}

	@Override
	public Object peek() {
		if (top == 0) {    // 操作空棧時拋出異常,異常可以自己編寫(只要繼承Exception)
			throw new IllegalStateException();
		}		
		return array[top - 1];
	}

	@Override
	public Object pop() {
		if (top == 0) {
			throw new IllegalStateException();
		}
		Object obj = array[--top];
		array[top] = null;
		return obj;
	}

	@Override
	public void push(Object obj) {
		if(top == array.length) {
			expand();
		}
		array[top ++] = obj;	// 只能向棧頂插入數據
	}

	@Override
	public int size() {
		return top;
	}

	private void expand() {		// 輔助方法,數組長度加倍
		Object[] newArray = new Object[2*array.length];
		for(int i = 0; i < array.length; i++) {
			newArray[i] = array[i];
		}
		array = newArray;
	}
	
	public String toString() {
//		StringBuilder str = new StringBuilder();
		String buf = "[ ";
		for (int i = 0; i < top; i++) {
			if(i > 0) {	  	// 在每個元素後面加“,”分隔
				buf += ", ";
			}
			buf += array[i];
		}
		buf += " ]";
		return buf;
	}

}
測試類:

package org.zp.datastruct;

public class ArrayStackTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Stack stack = new ArrayStack();
		stack.push("Array");
		stack.push("Number");
		stack.push("String");
		stack.push("Object");
		System.out.println("棧頂:" + stack.peek().toString());
		System.out.println(stack.toString());
//		System.out.println("刪除棧頂後:" + stack.pop().toString());
//		System.out.println(stack.toString());
//		stack.clear();
		System.out.println(stack.size());
		System.out.println(stack.isEmpty());
		System.out.println(stack.toString());
	}

}






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章