C/C++數(shù)據(jù)結(jié)構(gòu):棧結(jié)構(gòu)解析,最簡單解析,讓你一遍就會

上一章節(jié)針對于C語言最基本的數(shù)據(jù)結(jié)構(gòu)鏈?zhǔn)浇Y(jié)構(gòu)體做了解析,不清楚的可以回顧一下。本章節(jié)主要針對于C語言的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)棧做以解析。
數(shù)據(jù)結(jié)構(gòu)之棧
棧(stack)又名堆棧,它是一種運(yùn)算受限的線性表。限定僅在表尾進(jìn)行插入和刪除操作的線性表。這一端被稱為棧頂,相對地,把另一端稱為棧底。向一個棧插入新元素又稱作進(jìn)棧、入?;驂簵?,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個棧刪除元素又稱作出?;蛲藯?,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素。

故?;静僮魅缦?
(1)創(chuàng)建棧
(2)入棧
(3)出棧
(4)判斷棧是否為NULL
(5)返回棧頂元素
數(shù)據(jù)結(jié)構(gòu)之棧分類
根據(jù)實(shí)現(xiàn)棧的方式,我們可以把棧分為以下三種描述方式:
原生數(shù)組描述
動態(tài)申請內(nèi)存的數(shù)組描述
鏈?zhǔn)浇Y(jié)構(gòu)描述
原生數(shù)組描述棧
數(shù)組描述棧,只不過多了后進(jìn)先出的限制而已,它是靜態(tài)分配的,即使用前,它的內(nèi)存就已經(jīng)以數(shù)組的形式分配好了,所以在使用時,需要注意棧頂標(biāo)記的大小。
舉個例子,把十進(jìn)制的數(shù)字5轉(zhuǎn)二進(jìn)制的數(shù)字,過程大概是這樣:

原生數(shù)組描述棧實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換代碼

動態(tài)數(shù)組實(shí)現(xiàn)棧
動態(tài)申請內(nèi)存的數(shù)組描述不在采用上述實(shí)用性的方法了,而是通過封裝相關(guān)棧函數(shù)去描述這種結(jié)構(gòu)。這是寫數(shù)據(jù)結(jié)構(gòu)的一種大致方法。
1.結(jié)構(gòu)體定義與棧的創(chuàng)建過程:
結(jié)構(gòu)體定義:描述棧的屬性棧:棧容量,棧頂標(biāo)記
創(chuàng)建棧其實(shí)就是創(chuàng)建結(jié)構(gòu)體變量
具體代碼

ps:棧頂標(biāo)記初始值一般都是-1 ,為了滿足棧頂標(biāo)記和數(shù)組下標(biāo)一致
2.入棧操作
注意: 我們的實(shí)現(xiàn)是將最新的元素放在了數(shù)組的末尾, 那么數(shù)組末尾的元素就是我們的棧頂元素,故可以使用棧頂標(biāo)記去計(jì)算棧中的元素個數(shù)。然后每次入棧后,棧頂標(biāo)記往后移動。
具體實(shí)現(xiàn)代碼:

3.出棧操作和獲取棧頂元素
注意: 出棧操作應(yīng)該是將棧頂?shù)脑貏h除,由于數(shù)組實(shí)現(xiàn)的棧無法刪除,故只能吧棧頂標(biāo)記往前移動,簡稱為一種"偽刪除"。
具體實(shí)現(xiàn)代碼:

4.判斷棧是否為空
用戶判斷棧中是否有元素,通過棧頂標(biāo)記去做即可
具體實(shí)現(xiàn)代碼:

動態(tài)申請內(nèi)存的數(shù)組描述棧實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換代碼

鏈?zhǔn)綏?/strong>
鏈?zhǔn)綏#烘湵淼念^插法即可

這個不做詳細(xì)分析了,希望對大家有幫助!
另外如果你想更好的提升你的編程能力,學(xué)好C語言C++編程!彎道超車,快人一步!
分享(源碼、項(xiàng)目實(shí)戰(zhàn)視頻、項(xiàng)目筆記,基礎(chǔ)入門教程)
歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長比自己琢磨更快哦!

學(xué)習(xí)C/C++編程知識,提升C/C++編程能力,歡迎關(guān)注UP一起來成長!
另外,UP在主頁上傳了一些學(xué)習(xí)C/C++編程的視頻教程,有興趣或者正在學(xué)習(xí)的小伙伴一定要去看一看哦!會對你有幫助的~
編程學(xué)習(xí)軟件分享:

編程學(xué)習(xí)視頻分享:
