一.什么是棧
棧是一種特殊的線性表,它只允許在固定的一端進行元素的添加與使用,且遵循先進后出的原則。添加取用元素的一端稱為棧頂,另一端稱為棧底。出棧和入棧都是操作棧頂元素
二.棧的模擬實現
棧的底層是一個數組
這是里面的成員變量以及構造方法
壓棧(入棧)
首先要檢測棧是否滿,如果滿,就要進行2倍擴容。注意,此擴容會產生新的對象!!!而不是在原數組上擴容。
出棧
遵循后進先出,所以要返回數組最后一個元素,而且要更新size的值。
這樣對嗎?顯然沒有考慮棧為空的情況,修改如下:
獲取棧頂元素
三.Stack的使用
這里發現,Stack竟然沒有數組來存放元素,這是因為,它用的是它的父類Vector的數組
入棧:
調用了父類的addElement方法:
要確定容量,容量不夠就要擴容:
這里提到了capacityIncrement這個量,我們看一下這個量的解釋:
這是一個容量增量,在擴容時,數組容量的增加量就是我們所指定的capacityIncrement的大小,而當沒有指定這個量時,數組就會進行二倍擴容。
再繼續看grow方法:
newcapacity的大小就是我上面說的,用它與mincapacity比較,選擇其中的最大值進行擴容。注意,擴容是產生新的數組。
出棧:
調用了另一個方法:
首先檢查下標合法性,然后將它之后的元素整體向前一定一位。注意將末尾位置置為空!!!
獲取棧頂元素:
還是調用了另一個方法:
然后再用一個方法返回對應下標的元素:
用到了向下轉型
返回某一元素的下標:
用到了一個方法:
先判斷下表是否合法,再看o是否為null,否則走else語句
為什么要判斷是否為null?因為只有不為null時才能調用equals方法!!!否則就會空指針異常