thinking in java (十四) ----- 集合之Stack
阿新 • • 發佈:2018-11-08
stack很簡單,繼承與Vector
stack介紹
- stack簡介
stack是棧,特性是先進後出(FILO)
java中的stack是繼承自Vector(向量佇列)由於Vector是陣列實現的,這就意味著stack也是通過陣列實現的 ,而非連結串列。
- stack繼承關係
java.lang.Object ↳ java.util.AbstractCollection<E> ↳ java.util.AbstractList<E> ↳ java.util.Vector<E> ↳ java.util.Stack<E> public class Stack<E> extends Vector<E> {}
stack和collection介面的關係
- 建構函式
只有一個預設構造
Stack()
stack原始碼分析
其 原始碼是非常簡單的
package java.util; public class Stack<E> extends Vector<E> { // 版本ID。這個用於版本升級控制,這裡不須理會! private static final long serialVersionUID = 1224463164541339165L; // 建構函式 public Stack() { } // push函式:將元素存入棧頂 public E push(E item) { // 將元素存入棧頂。 // addElement()的實現在Vector.java中 addElement(item); return item; } // pop函式:返回棧頂元素,並將其從棧中刪除 public synchronized E pop() { E obj; int len = size(); obj = peek(); // 刪除棧頂元素,removeElementAt()的實現在Vector.java中 removeElementAt(len - 1); return obj; } // peek函式:返回棧頂元素,不執行刪除操作 public synchronized E peek() { int len = size(); if (len == 0) throw new EmptyStackException(); // 返回棧頂元素,elementAt()具體實現在Vector.java中 return elementAt(len - 1); } // 棧是否為空 public boolean empty() { return size() == 0; } // 查詢“元素o”在棧中的位置:由棧底向棧頂方向數 public synchronized int search(Object o) { // 獲取元素索引,elementAt()具體實現在Vector.java中 int i = lastIndexOf(o); if (i >= 0) { return size() - i; } return -1; } }
總結:stack實際上也是通過陣列進行實現的
執行push時(將元素推入棧中),是通過將元素追加到陣列的末尾中
執行peek時(取出棧頂元素,不執行刪除),返回陣列末尾的元素
執行pop時(取出棧頂元素,執行刪除)
Stack繼承於Vector,意味著Vector擁有的功能屬性他都擁有
Vector示例
import java.util.Stack; import java.util.Iterator; import java.util.List; /** * @desc Stack的測試程式。測試常用API的用法 * * @author skywang */ public class StackTest { public static void main(String[] args) { Stack stack = new Stack(); // 將1,2,3,4,5新增到棧中 for(int i=1; i<6; i++) { stack.push(String.valueOf(i)); } // 遍歷並打印出該棧 iteratorThroughRandomAccess(stack) ; // 查詢“2”在棧中的位置,並輸出 int pos = stack.search("2"); System.out.println("the postion of 2 is:"+pos); // pup棧頂元素之後,遍歷棧 stack.pop(); iteratorThroughRandomAccess(stack) ; // peek棧頂元素之後,遍歷棧 String val = (String)stack.peek(); System.out.println("peek:"+val); iteratorThroughRandomAccess(stack) ; // 通過Iterator去遍歷Stack iteratorThroughIterator(stack) ; } /** * 通過快速訪問遍歷Stack */ public static void iteratorThroughRandomAccess(List list) { String val = null; for (int i=0; i<list.size(); i++) { val = (String)list.get(i); System.out.print(val+" "); } System.out.println(); } /** * 通過迭代器遍歷Stack */ public static void iteratorThroughIterator(List list) { String val = null; for(Iterator iter = list.iterator(); iter.hasNext(); ) { val = (String)iter.next(); System.out.print(val+" "); } System.out.println(); } }
1 2 3 4 5 the postion of 2 is:4 1 2 3 4 peek:4 1 2 3 4 1 2 3 4