棧是一種特殊的線性表。其特殊性在于限定插入和刪除數(shù)據元素的操作只能在線性表的一端進行,也就是說只能在棧頂進行插入(push進棧)和刪除(pop出棧)操作,進棧出棧的復雜度均為O(1),棧中的數(shù)據元素遵守”先進后出"(First In Last Out)的原則,簡稱FILO結構。
image
image
可以看到在壓棧的過程中,棧頂?shù)奈恢靡恢痹凇毕蛏稀耙苿樱鴹5资枪潭ú蛔兊摹3鰲5捻樞蚺c入棧時相反,這就是所謂的”先入后出“。在出棧的過程中,棧頂位置一直在”向下“移動,而棧底一直保持不變。
棧既然是一個表,因此任何實現(xiàn)表的方式都能實現(xiàn)棧(數(shù)組、鏈表(單向鏈表、雙向鏈表或循環(huán)鏈表))。
棧的數(shù)組實現(xiàn)
image
棧的數(shù)組實現(xiàn)相對流行和簡單,但唯一的潛在危害是需要提前聲明一個數(shù)組大小。為了防止數(shù)組越界,可以在棧的程序中加入數(shù)組越界的檢查,但他們會影響棧的執(zhí)行效率。
棧的鏈表實現(xiàn)
image
以鏈表頭為作為棧頂,這樣方便節(jié)點的插入與刪除。壓棧產生的新節(jié)點將一直出現(xiàn)在鏈表的頭部。這種實現(xiàn)方法的缺點在于分配和釋放內存的開銷比較大。
什么場景會用到棧呢?
計算器,涉及運算先后順序,涉及計算狀態(tài)的保存,通過棧能夠容易的實現(xiàn),把表達式轉化為后綴表達式(也可以通過棧來實現(xiàn)),遇到數(shù)時壓棧,遇到運算符時,出棧兩個數(shù)并通過運算符計算。
漢諾塔的問題也可以通過棧來解決。