棧是一種"後進先出(LIFO)"的資料結構.最近壓入的資料項目總是位於棧頂的.
首先我們先定義一個Stack Interface,我們把他定義成泛型的.
/** * Stack介面 * @author Chris Wang * * @param <E> */public interface Stack<E> { /** * 判斷棧是否為空白 * @return */ public boolean isEmpty(); /** * 返回棧中元素個數 * @return */ public int size(); /** * 入棧 * @param target * */ public void push(E target); /** * 出棧 * @return E */ public E pop(); /** * 返回棧頂元素,並不出棧 * @return */ public E top(); }
然後進行利用Java中的數組實現ArrayStack,下面是代碼:
Code
/**
* 一個基於數組的棧實現
*
* @author Chris Wang
* @param <E>
*/
public class ArrayStack<E> implements Stack<E> {
/**
* 表示要存入棧裡的元素
*/
private E[] data;
/**
* 表示當前棧的容量
*/
private int size = 0;
public ArrayStack() {
data = (E[]) new Object[10];
//一開始的時候 棧中元素為空白
size = 0;
}
public int size() {
return size;
}
public boolean isEmpty() {
return size < 1;
}
/**
* 返回棧頂元素,但是不出棧
*/
public E top() {
if (isEmpty()) {
throw new RuntimeException("鏈表為空白!!");
}
return data[size-1];
}
/**
* 出棧
*/
public E pop() {
if (isEmpty()) {
throw new RuntimeException("鏈表為空白!!");
}
// 先儲存那個棧頂元素
E element = data[size - 1];
// 然後清空棧頂元素,
data[size] = null;
//棧中元素減少一個
size--;
return element;
}
/**
* 入棧的時候先判斷 棧是否已滿,如棧滿就擴充
*/
public void push(E target) {
if(target==null)
throw new RuntimeException("插入的元素不可為NULL");
if (isFull()) {
enlarge();
}
size++;
// 往棧頂添加一個元素
data[size - 1] = target;
}
/**
* 擴充數組長度 注意:一般是判斷棧滿以後 才擴充 擴充為原數組的兩倍長度
*/
public void enlarge() {
E[] newData = (E[]) new Object[data.length * 2];
for (int i = 0; i < size; i++) {
newData[i] = data[i];
}
data = newData;
}
/**
* 如果數組的長度 已經等於 放入棧中的元素數量 則表示 棧已經滿了
*
* @return
*/
public boolean isFull() {
return data.length == size;
}
}