Java棧資料結構的實現方式

liuzhenfeng的部落格發表於2014-12-16

棧是Java語言中最重要的資料結構之一,它的實現,至少應該包括以下幾個方法:

  1. pop() 出棧操作,彈出棧頂元素。
  2. push(E e) 入棧操作
  3. peek() 檢視棧頂元素
  4. isEmpty() 棧是否為空

另外,實現一個棧,還應該考慮到幾個問題:

  1. 棧的初始大小以及棧滿以後如何新增棧空間
  2. 對棧進行更新時需要進行同步

簡單示例,使用陣列實現棧,程式碼如下:

public class Stack<E> {  

    // Java 不支援泛型陣列,如需使用,請使用Java提供的容器  
    private Object[] stack;  

    // 棧的預設初始大小  
    private static final int INIT_SIZE = 2;  

    // 棧頂索引  
    private int index;  

    public Stack() {  
        stack = new Object[INIT_SIZE];  
        index = -1;  
    }  

    /**  
     * 構造方法  
     *   
     * @param initSize  
     *            棧的初始大小  
     */ 
    public Stack(int initSize) {  
        if (initSize < 0) {  
            throw new IllegalArgumentException();  
        }  
        stack = new Object[initSize];  
        index = -1;  
    }  

    /**  
     * 出棧操作  
     *   
     * @return 棧頂物件  
     */ 
    public synchronized E pop() {  
        if (!isEmpty()) {  
            E temp = peek();  
            stack[index--] = null;  
            return temp;  
        }  
        return null;  
    }  

    /**  
     * 入棧操作  
     *   
     * @param obj  
     *            等待入棧的物件  
     */ 
    public synchronized void push(E obj) {  
        if (isFull()) {  
            Object[] temp = stack;  
            // 如果棧滿,則建立空間為當前棧空間兩倍的棧  
            stack = new Object[2 * stack.length];  
            System.arraycopy(temp, 0, stack, 0, temp.length);  
        }  
        stack[++index] = obj;  
    }  

    /**  
     * 檢視棧頂物件  
     *   
     * @return 棧頂物件  
     */ 
    public E peek() {  
        if (!isEmpty()) {  
            return (E) stack[index];  
        }  
        return null;  
    }  

    /**  
     * 檢視棧是否為空  
     *   
     * @return 如果棧為空返回true,否則返回false  
     */ 
    public boolean isEmpty() {  
        return index == -1;  
    }  

    /**  
     * 檢視棧是否滿  
     *   
     * @return 如果棧滿返回true,否則返回false  
     */ 
    public boolean isFull() {  
        return index >= stack.length - 1;  
    }  
}

最後說明,Java中實現了棧(java.util.Stack)的資料結構,它是通過繼承Vector類實現的,一般情況下我們直接拿來用就行了。

相關文章