數據結構筆記淺記(十)棧

「棧 stack」是一種遵循先入後出邏輯的線性數據結構。 我們可以將棧類比爲桌面上的一摞盤子,如果想取出底部的盤子,則需要先將上面的盤子依次移走。我們將 盤子替換爲各種類型的元素(如整數、字符、對象等),就得到了棧這種數據結構。

棧遵循先入後出的原則,因此我們只能在棧頂添加或刪除元素。然而,數組和鏈表都可以在任意位置添加和刪除元素,因此棧可以視爲一種受限制的數組或鏈表。

 

基於鏈表的實現

使用鏈表實現棧時,我們可以將鏈表的頭節點視爲棧頂,尾節點視爲棧底。 對於入棧操作,我們只需將元素插入鏈表頭部,這種節點插入方法被稱爲“頭插法”。而對於 出棧操作,只需將頭節點從鏈表中刪除即可。

 

基於數組的實現

使用數組實現棧時,我們可以將數組的尾部作爲棧頂。入棧與出棧操作分別對應在數組尾部 添加元素與刪除元素,時間複雜度都爲 𝑂(1) 。

 

兩種實現對比

支持操作:兩種實現都支持棧定義中的各項操作。數組實現額外支持隨機訪問,但這已超出了棧的定義範疇,因此一般 不會用到。

時間效率:在基於數組的實現中,入棧和出棧操作都在預先分配好的連續內存中進行,具有很好的緩存本地性,因此效率較高。然而,如果入棧時超出數組容量,會觸發擴容機制,導致該次入棧操作的時間複雜度變爲 𝑂(𝑛) 。 在基於鏈表的實現中,鏈表的擴容非常靈活,不存在上述數組擴容時效率降低的問題。但是,入棧操作需要 初始化節點對象並修改指針,因此效率相對較低。不過,如果入棧元素本身就是節點對象,那麼可以省去初 始化步驟,從而提高效率。

         綜上所述,當入棧與出棧操作的元素是基本數據類型時,例如 int 或 double ,我們可以得出以下結論。

                ‧ 基於數組實現的棧在觸發擴容時效率會降低,但由於擴容是低頻操作,因此平均效率更高。

                ‧ 基於鏈表實現的棧可以提供更加穩定的效率表現。

空間效率:在初始化列表時,系統會爲列表分配“初始容量”,該容量可能超出實際需求;並且,擴容機制通常是按照特 定倍率(例如 2 倍)進行擴容的,擴容後的容量也可能超出實際需求。因此,基於數組實現的棧可能造成一 定的空間浪費。 然而,由於鏈表節點需要額外存儲指針,因此鏈表節點佔用的空間相對較大。 綜上,我們不能簡單地確定哪種實現更加節省內存,需要針對具體情況進行分析。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章