@toc
<code>棧</code>:一種特殊的<code>線性表</code>,其<code>隻允許在固定的一端進行插入和删除元素操作</code>。進行資料插入和删除操作的一端稱為棧頂,另一端稱為棧底。棧中的資料元素<code>遵守後進先出lifo</code>(last in first out)的原則。
<code>壓棧</code>:棧的插入操作叫做進棧/壓棧/入棧,<code>入資料在棧頂</code>
<code>出棧</code>:棧的删除操作叫做出棧。<code>出資料也在棧頂</code>
<code>棧的實作</code>一般可以使用<code>數組或者連結清單實作</code>,相對而言<code>數組</code>的結構實作<code>更優</code>一些。因為數組在尾上插入資料的<code>代價比較小</code>。
順序表可以把使用的空間寫成固定值,也可以建構動态開辟記憶體;但是如果寫成固定的數組形式當存的資料滿了就不能再使用了,是以下面我們<code>實作的是動态開辟記憶體</code>的形式。
是以我們先建立一個順序表結構體類型,結構體類型中有指針,下标,容量。
指針: 用來維護在堆上連續的一段空間,
下标:表示資料存放到哪一個位置了,因為資料隻能一個接着一個地存放,要有個下标來記錄我資料放到哪一個位置了。
容量:與下标相比較,當下标與容量相等就表示空間存儲滿了,要進行擴容處理。
建立類型如下:
棧的初始化和銷毀都與順序表類似,這裡就不再詳細解釋,隻是順序表中的size(有效元素個數),換成了這裡的棧頂。
與順序表一樣,增加元素時必須先判斷容量是否足夠,容量不夠時需擴容。
這裡的入棧和順序表的尾插一樣。
出棧即尾删,删除元素需判斷棧是否為空,空棧不能出棧。
判斷棧是否為空在下面實作。
棧頂元素即順序表中最後一個元素,直接根據下标即可找到。
當然棧不能為空。
<code>隊列</code>:<code>隻允許在一端進行插入資料操作</code>,在<code>另一端進行删除資料操作</code>的特殊線性表,隊列具有<code>先進先出</code>fifo(first in first out)的性質。 隊列:進行插入操作的一端稱為隊尾 出隊列: 進行删除操作的一端稱為隊頭
入隊列:進行插入操作的一端稱為隊尾
出隊列:進行删除操作的一端稱為隊頭
隊列也可以數組和連結清單的結構實作,使用連結清單的結構實作更優一些,因為如果使用數組的結構,出隊列在數組頭上出資料,效率會比較低。
而連結清單我們采用雙向連結結構,一個指針來維護頭節點,一個指針維護尾部節點
定義的結構體類型如下:
初始化:初始化隻需将兩個指針置為null。
銷毀:同連結清單一樣,儲存下一個結點位址,釋放目前結點,直到指針為null。
入隊和單連結清單的尾插一樣,隻是這裡更簡單,這裡不需要找尾。
注意:
隊列為空。
隊列不為空。
和單連結清單頭删一樣,儲存第二個結點位址釋放,隊頭位置。
注意:隊列不能為空。
傳回隊頭元素即可。
傳回隊尾元素即可。
直接判斷頭指針是否為空,就可判斷隊列是否為空。