棧 是一種抽象的數據結構,只容許在有序線性數據集合的一段進行入棧和出棧操做,所以是按照後進先出(LIFO, Last In First Out)的原理操做元素。容許進行入棧和出棧的一端稱爲棧頂(TOP),另外一端稱爲棧底(BOTTOM)。棧頂會隨出棧入棧浮動的,當棧中元素個數爲零時稱爲空棧。java
棧經常使用一維數組或鏈表來實現。算法
棧的特色:
先進後出,後入先出。
除頭尾節點外,每一個元素有一個前驅節點,一個後繼節點。數組
因爲棧結構是後進先出原則,經常使用於程序裏的遞歸,函數調用,局部變量臨時存儲,瀏覽器裏的前進後。在大話數據結構和算法一書中舉例特形象,手槍的彈夾就是棧的典型使用,裝彈其實就是入棧操做,開槍其實就是出棧操做。瀏覽器
我用一維數組來簡單實現入棧出棧。
棧的存儲結構微信
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; }
棧 在計算機的世界裏是一個很是經常使用的數據結構,函數調用的存儲和函數裏分配的局部變量都用棧結構來存儲的。瀏覽器裏的前進和後退也就是一個入棧和出棧的操做。這裏是用數組的方式來做爲棧的存儲結構,有興趣的朋友能夠用鏈表的方式來實現棧結構。函數
PS:
清山綠水始於塵,博學多識貴於勤。
我有酒,你有故事嗎?
微信公衆號:「清塵閒聊」。
歡迎一塊兒談天說地,聊代碼。spa