Stack<E> 實作後進先出 (LIFO) 棧結構,繼承自 Vector<E>,底層以動態陣列儲存。同步安全但效能較差,現代開發建議改用 ArrayDeque 或 LinkedList。


| 方法 | 說明 | 同步 |
|---|---|---|
push(E item) | 壓入棧頂,回傳元素 | 否 |
pop() | 彈出並移除棧頂元素 | 是 |
peek() | 查看棧頂元素不移除 | 是 |
empty() | 判斷是否為空 | 否 |
search(Object o) | 從棧底向上搜尋,回傳 1-based 位置 | 是 |
public class Stack<E> extends Vector<E> {
public E push(E item) {
addElement(item); // Vector 尾部新增
return item;
}
public synchronized E pop() {
E obj = peek();
removeElementAt(size() - 1); // 移除最後一個
return obj;
}
public synchronized E peek() {
int len = size();
if (len == 0) throw new EmptyStackException();
return elementAt(len - 1); // 直接取陣列最後一位
}
public boolean empty() { return size() == 0; }
public synchronized int search(Object o) {
int i = lastIndexOf(o); // 從尾部向前找
return (i >= 0) ? size() - i : -1;
}
}
push 相當於陣列尾部 add,pop/peek 直接存取 elementData[size-1]pop/peek/search 同步化search 回傳距離棧頂距離 (頂=1),非索引值Stack<String> stack = new Stack<>();
// 壓入 1~5
for (int i = 1; i <= 5; i++) stack.push(String.valueOf(i));
// 索引遍歷 (最快)
for (int i = 0; i < stack.size(); i++)
System.out.print(stack.get(i) + " "); // 1 2 3 4 5
// 搜尋位置
System.out.println("\n位置: " + stack.search("2")); // 4 (棧底=1, 棧頂=5)
// 彈出棧頂
stack.pop(); // 移除 5
// 查看新棧頂
System.out.println("Peek: " + stack.peek()); // 4
// Iterator 遍歷
for (Iterator<String> it = stack.iterator(); it.hasNext(); )
System.out.print(it.next() + " "); // 1 2 3 4
// 非同步、效能更好、功能更豐富
Deque<String> stack = new ArrayDeque<>();
stack.push("a"); stack.push("b");
stack.pop(); // 彈出
stack.peek(); // 查看
// 或 LinkedList (同樣實作 Deque)
Deque<String> stack2 = new LinkedList<>();
結論:單線程、高效能場景請用 ArrayDeque;需同步可用 Collections.synchronizedDeque 包裝。Stack 屬 Legacy 類別,新專案不建議使用。