在 Java 中 Stack 類表示后進(jìn)先出(LIFO)的對象堆棧。棧是一種非常常見的數(shù)據(jù)結(jié)構(gòu),它采用典型的先進(jìn)后出的操作方式完成的。每一個棧都包含一個棧頂,每次出棧是將棧頂?shù)臄?shù)據(jù)取出,如下:
http://wiki.jikexueyuan.com/project/java-enhancement/images/31-1.jpg" alt="fig.1" />
Stack 通過五個操作對 Vector 進(jìn)行擴(kuò)展,允許將向量視為堆棧。這個五個操作如下:
操作 | 說明 |
empty() | 測試堆棧是否為空。 |
peek() | 查看堆棧頂部的對象,但不從堆棧中移除它。 |
pop() | 移除堆棧頂部的對象,并作為此函數(shù)的值返回該對象。 |
push(E item) | 把項(xiàng)壓入堆棧頂部。 |
search(Object o) | 返回對象在堆棧中的位置,以 1 為基數(shù)。 |
Stack 繼承 Vector,他對 Vector 進(jìn)行了簡單的擴(kuò)展:
public class Stack<E> extends Vector<E>
Stack 的實(shí)現(xiàn)非常簡單,僅有一個構(gòu)造方法,五個實(shí)現(xiàn)方法(從Vector繼承而來的方法不算與其中),同時其實(shí)現(xiàn)的源碼非常簡單
/**
* 構(gòu)造函數(shù)
*/
public Stack() {
}
/**
* push函數(shù):將元素存入棧頂
*/
public E push(E item) {
// 將元素存入棧頂。
// addElement()的實(shí)現(xiàn)在Vector.java中
addElement(item);
return item;
}
/**
* pop函數(shù):返回棧頂元素,并將其從棧中刪除
*/
public synchronized E pop() {
E obj;
int len = size();
obj = peek();
// 刪除棧頂元素,removeElementAt()的實(shí)現(xiàn)在Vector.java中
removeElementAt(len - 1);
return obj;
}
/**
* peek函數(shù):返回棧頂元素,不執(zhí)行刪除操作
*/
public synchronized E peek() {
int len = size();
if (len == 0)
throw new EmptyStackException();
// 返回棧頂元素,elementAt()具體實(shí)現(xiàn)在Vector.java中
return elementAt(len - 1);
}
/**
* 棧是否為空
*/
public boolean empty() {
return size() == 0;
}
/**
* 查找“元素o”在棧中的位置:由棧底向棧頂方向數(shù)
*/
public synchronized int search(Object o) {
// 獲取元素索引,elementAt()具體實(shí)現(xiàn)在Vector.java中
int i = lastIndexOf(o);
if (i >= 0) {
return size() - i;
}
return -1;
}