怎麼理解堆棧指針(Stack Pointer)

 如果的堆棧的實現是往上長的(就是說往頂的方向長,其實質是棧底是定死的不能動,入棧的東西只能不斷往上疊,這就像在書桌上放書一樣,桌底是定死的,所以書只能一本一本地往上堆,往上長),計算機內部的堆棧的實現採取的就是這種模式,所以就得“先修改指針,然後插入數 據,出棧時剛好相反”,因爲堆棧指針指向的總是棧頂元素,棧底不能動,所以數據入棧前要先修改指針使它指向新的空餘空間然後再把數據存進去,出棧的時候 自然相反,可以聯繫上面舉的放書的例子。 

      然而,如果堆棧的實現是往下長的(就是說每壓一個元素入棧,棧底就自動下移一個元素的位置,其實質就是這種堆棧模型是一個“無底洞”型), 這個時候,棧頂就變成了定死的,就可以先壓入元素,然後再修改指針。因爲棧底是無限的,壓入一個元素,新的元素就取代先前的棧頂元素佔據棧頂 的位置,那麼先前的指向棧頂元素的指針這個時候就該修改讓它指向這個新的棧頂元素了。 

       下面就是對“無底洞”型堆棧的一種實現的描述: 
壓棧(入棧):將對象或者數據壓入棧中,更新棧頂指針,使其指向最後入棧的對象或   數據。 
彈棧(出棧):返回棧頂指向的對象或數據,並從棧中刪除該對象或數據,更新棧頂。 

       話說回來,計算機內部肯定選第一種模型,不會選第二種,因爲第二種模型,每壓入一個新的元素,都需要把之前堆棧裏的所有元素整體下移動一個元素的 位置,騰出棧頂元素的位置讓新的元素進來,這種平移可是一筆不小的開銷。但是並不是說“無底洞”模型就沒辦法實現了,其實它是可以通過第一種模型來模擬的,每需要壓入一個新的元素的時候,就先開闢一個空間,數據存入這個空間,然後再修改棧頂元素指針使其指向這個新的棧頂元素。 
 
       換句話說,用鏈表的話,只要有足夠的空間可開闢出來作爲一個節點,那麼兩種堆棧模型都能實現(當然“無底洞”型還是如上面說的那樣是用第一種模擬出來的,否則平移的工作量相當可觀),如果用數組,由於數組在內存中是連續分配出來的空間,用第一種模型更自然一些。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章