Java之--Stack棧


Stack棧
====================================================
後進先出】的結構

Stack本身通過擴展Vector而來,而Vector本身是一個可增長的對象數組(a growable array of objects)

棧的數組結構實現


jdk1.7(其它版本可能不同)
---------------------------------------------------------
Stack.class   5個方法
E push(E item)             把項壓入棧頂部。            
E pop()                           移除棧頂部的對象,並作爲此函數的值返回該對象。          
E peek()                         查看棧頂部的對象,但不從堆棧中移除它。         
boolean empty()           測試棧是否爲空。            
int search(Object o)     返回對象在棧中的位置,以1爲基數。      
---------------------------------------------------------
public class Stack<E> extends Vector<E>{}

public class Vector<E> extends AbstractList<E> implements List<E>, ...{
    protected Object[] elementData;     //數組
    protected int elementCount;             //數組中元素個數
    protected int capacityIncrement;      //自動遞增量(大小)
}

0.初始化
Stack stack = new Stack();//就這一個構造方法
會調用Vector的構造方法,Vector線程安全
public Vector() {
    this(10);
}
public Vector(int initialCapacity, int capacityIncrement) {
    this.elementData = new Object[initialCapacity];     //初始容量爲10
    this.capacityIncrement = capacityIncrement;          //初始遞增量爲0
}



1.push()把對象壓入棧頂
public E push(E item) {
       addElement(item);
        return item;
}
public synchronized void addElement(E obj) {
        modCount++;
        ensureCapacityHelper(elementCount + 1);//確保需不需要擴容
        elementData[elementCount++] = obj;//elementCount++數組中元素個數加1;加入的數據依次往後放
}
private void ensureCapacityHelper(int minCapacity) {
        if (minCapacity - elementData.length > 0)//大於數組中元素個數時擴容
            grow(minCapacity);//擴容
}

//Stack stcapacityIncrement=0,擴容量爲原來的一倍
//原來elementData.length=10,擴容後爲20,再擴容後爲40
private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                         capacityIncrement : oldCapacity);//如果capacityIncrement=0,擴容量爲原來的一倍
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)//MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
            newCapacity = hugeCapacity(minCapacity);
        elementData = Arrays.copyOf(elementData, newCapacity);
}

2.pop()移除棧頂部的對象
public synchronized E pop() {
        E obj = peek();//棧頂對象
        removeElementAt(size() - 1);//移除棧頂對象

        return obj;//返回棧頂對象
    }
public synchronized void removeElementAt(int index) {
      ......  
        elementCount--;
        elementData[elementCount] = null;
    }

3.peek()查看棧頂部的對象
//return the object at the top of this stack (the last item of the Vector object).
public synchronized E peek() {
        int     len = size();

        if (len == 0)
            throw new EmptyStackException();
        return elementAt(len - 1);
    }
相當於 elementData[size() - 1]

4.empty()
public boolean empty() {
        return size() == 0;
    }

5. search()返回對象在棧中的位置
public synchronized int search(Object o) {
        int i = lastIndexOf(o);

        if (i >= 0) {
            return size() - i;//對象在棧中的位置,以1爲基數;從棧頂到棧底的順序
        }
        return -1;
    }
public synchronized int lastIndexOf(Object o, int elementCount-1) {
        ......
        for (int i = index; i >= 0; i--)//從數組後面往前找(相當於從棧頂往棧底找)
            if (o.equals(elementData[i]))
               return i;
        
        return -1;
    }

Stack不要求其中保存數據的唯一性,當Stack中有多個相同的item時,調用search方法,

只返回與查找對象equal並且離棧頂最近的item與棧頂間距離


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章