什麼是棧?
棧 是一種抽象的資料結構,只允許在有序線性資料集合的一段進行入棧和出棧操作,因此是按照後進先出(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;
}
複製程式碼
總結
棧 在計算機的世界裡是一個非常常用的資料結構,函式呼叫的儲存和函式裡分配的區域性變數都用棧結構來儲存的。瀏覽器裡的前進和後退也就是一個入棧和出棧的操作。上面寫了下用陣列的方式來作為棧的儲存結構,有興趣的朋友可以用連結串列的方式來實現棧結構。