目錄
1.棧的定義
1.1棧是限定僅在表尾進行插入和刪除操作的線性表
我們把允許插入和刪除的一端稱爲棧頂(線性表的表尾),另一端稱爲棧底,不含任何元素的棧稱爲空棧。棧又稱後進先出的線性表,簡稱LIFO結構。
插入操作叫做進棧,刪除操作叫做出棧。
1.2進棧出棧的變化形式
- 1,2,3進,3,2,1出 出棧次序 3,2,1
- 1進,1出,2進,2出,3進,3出 出棧次序 1,2,3
- 1進,2進,2出,1出,3進,3出 出棧次序 2,1,3
- 1進,1出,2進,3進,3出 ,2出 出棧次序 1,3,2
- 1進,2進,2出,3進,3出 ,1出 出棧次序 2,3,1
1.3棧的順序存儲結構
棧的順序存儲其實也是線性表的存儲的簡化,簡稱順序棧。下標0的一端作爲棧底。
棧的順序存儲結構由於只允許棧頂進出元素,所以不存在線性表插入和刪除需要移動元素的問題,不過有一個很大的缺陷,就是要事先確定存儲空間的大小。對於一個棧,也只能考慮周全,設計合適大小的數組來處理,對於兩個相同類型的棧,可以最大限度利用事先開闢的存儲空間進行操作。
top1和top2是棧1和棧2的棧頂指針,top1+1==top2 時,代表棧滿了。
一般使用這個雙棧共享結構的,通常都是兩個棧有相反關係,就是一個棧增長時另一個棧在縮短
1.4棧的鏈式存儲結構
棧的鏈式存儲結構,簡稱棧鏈。
棧只是棧頂做刪除和插入操作,由於單鏈表有頭指針,而棧頂指針也是必須的,所以比較好的辦法是把棧頂放在單鏈表的頭部。由於已經有頭部在頭頂了,單鏈表中比較常見的頭結點就失去了意義,通常對於棧鏈說,是不需要頭結點的。
進棧操作:把當前棧頂元素賦值給新結點的直接後繼>將新結點s賦值給棧頂指針
出棧操作:將棧頂結點賦值給p>使棧頂元素下移一位,指向後一結點>釋放結點
如果使用過程中元素不可預料,有時小,有時非常大,那麼最好用鏈棧,如果變化在可控範圍
2.隊列的定義
隊列是隻允許在一端進行插入操作,而在另一端進行刪除操作的線性表
是一種先進先出的線性表,簡稱FIFO,允許插入的稱爲隊尾,允許刪除的一端稱爲隊頭。
2.1隊列的順序存儲結構
順序存儲結構的不足:插入時就是在隊尾追加一個元素,不需要移動任何元素,時間複雜度爲O(1),刪除出隊時,爲了保證隊頭不爲空,所有元素都要向前移動,時間複雜度O(1).
由於每次都要移動全部元素所以如果不去限制隊列的對頭一定要在下標爲0的位置就不用所有元素都向前移動。所以引入兩個指針,一個指向對頭元素,一個指向隊尾元素的下一個位置。(循環隊列)
2.2隊列的鏈式存儲結構
其實就是線性表的單鏈表,只不過它只能尾進頭出,簡稱鏈隊列。隊頭指針指向鏈隊列的頭結點,隊尾指針指向終端結點,空隊列時都指向頭結點。
入隊操作:在鏈表尾部插入結點
出隊操作:頭結點的後繼結點出隊,將頭結點的後繼改爲出隊結點的後繼結點