資料結構之「棧」

清塵閒聊發表於2019-03-20

什麼是棧?

棧 是一種抽象的資料結構,只允許在有序線性資料集合的一段進行入棧和出棧操作,因此是按照後進先出(LIFO, Last In First Out)的原理操作元素。允許進行入棧和出棧的一端稱為棧頂(TOP),另一端稱為棧底(BOTTOM)。棧頂會隨出棧入棧浮動的,當棧中元素個數為零時稱為空棧。 棧常用一維陣列或連結串列來實現。 棧的特點: 先進後出,後入先出。 除頭尾節點外,每個元素有一個前驅,一個後繼節點。

棧

棧有什麼作用?

由於棧結構是後進先出原則,常用於程式裡的函式呼叫,區域性變數臨時儲存,瀏覽器裡的前進後。在大話資料結構和演算法一書中舉例特形象,手槍的彈夾就是棧的典型使用,裝彈其實就是入棧操作,開槍其實就是出棧操作。

棧該怎麼使用?

我用一維陣列來簡單實現入棧出棧。 棧的儲存結構

public class Stack {
    //儲存元素
    Object[] elementData;
    //元素個數
    int elementCount;
}
複製程式碼

入棧

public E push(E item) {
    //需要的最小容量是當前元素總數 + 1
    int minCapacity = elementCount + 1;
    //假如最小需要元素總數大於陣列長度,這擴容一倍
    if (minCapacity - elementData.length > 0) {
        int newCapacity = minCapacity * 2;
        elementData = Arrays.copyOf(elementData, newCapacity);
    }
    //給元素總數加一併把元素賦值給陣列
    elementData[elementCount++] = item;
}
複製程式碼

出棧

public E pop() {
    //獲取元素總數
    int len = elementCount;
    //獲取棧頂元素
    E obj = (E) elementData[len - 1];
    //元素減一
    elementCount--;
    //置空
    elementData[elementCount] = null;
}
複製程式碼

總結

棧 在計算機的世界裡是一個非常常用的資料結構,函式呼叫的儲存和函式裡分配的區域性變數都用棧結構來儲存的。瀏覽器裡的前進和後退也就是一個入棧和出棧的操作。上面寫了下用陣列的方式來作為棧的儲存結構,有興趣的朋友可以用連結串列的方式來實現棧結構。

相關文章