標籤:
前言:
“後進先出”---是棧(Stack)這種資料結構最基本的特點。很多程式設計語言都具有封裝好的Stack工具,本文就帶領大家一起將棧溫習一下並附上一個類比棧的程式。
Java記憶體配置中,每通過new操作執行個體化一個對象時,其實對象是不規律地存放的。只不過JVM在載入完一個累並執行個體化一個對象之後又將堆中對應對象的記憶體位址通過引用變數規律地存放在棧中的。可通過下面的草圖簡單理解一下:
基於Java本身的記憶體機制,加上Stack是一個基礎的資料結構。本文將用Java代碼實現自己的一個類,其功能跟Java內部的Stack差不多,實現的原理也很近似。
1 package stack; 2 3 public class MyStack { 4 5 private Object[] elements; 6 private int size; 7 private final static int CAPACITY=10; 8 9 public MyStack(){10 this(CAPACITY);11 }12 13 public MyStack(int capacity) {14 elements = new Object[capacity];15 }16 17 public void push(Object o){18 int len=elements.length;19 if(size>=len){20 Object[] temp=new Object[2*len];21 System.arraycopy(elements, 0, temp, 0, len);22 elements=temp;23 }24 elements[size++]=o;25 }26 public Object pop(){27 return elements[--size];28 }29 public Object peek(){30 return elements[size-1];31 }32 public int getSize(){33 return size;34 }35 public boolean empty(){36 return size==0;37 }38 39 }
測試代碼:
1 package stack; 2 3 public class TestStack { 4 5 /** 6 * @param args 7 */ 8 public static void main(String[] args) { 9 test2();10 } 11 12 private static void test2() {13 MyStack stack = new MyStack();14 for(int i=1;i<=15;i++){15 stack.push("str"+i);16 }17 while(!stack.empty()){18 System.out.println(stack.pop());19 }20 System.out.println("--end--");21 } 22 23 }
Java棧的執行個體類比