C語言棧的圖文解析和實(shí)現(xiàn)
棧(stack),是一種線性存儲結(jié)構(gòu),它有以下幾個(gè)特點(diǎn):
棧中數(shù)據(jù)是按照"后進(jìn)先出(LIFO, Last In First Out)"方式進(jìn)出棧的。
向棧中添加/刪除數(shù)據(jù)時(shí),只能從棧頂進(jìn)行操作。
棧通常包括的三種操作:push、peek、pop。
push——向棧中添加元素。
peek——返回棧頂元素。
pop——返回并刪除棧頂元素的操作。
1. 棧的示意圖
棧中的數(shù)據(jù)依次是30→20→10。
2. 出棧
出棧前:棧頂元素是30。此時(shí),棧中的元素依次是30→20→10。
出棧后:30出棧之后,棧頂元素變成20。此時(shí),棧中的元素依次是20→10。
3. 入棧
入棧前:棧頂元素是20。此時(shí),棧中的元素依次是20→10。
入棧后:40入棧之后,棧頂元素變成40。此時(shí),棧中的元素依次是 40→20→10。
實(shí)現(xiàn)代碼:
運(yùn)行結(jié)果:
tmp=30
tmp=20
stack size()=3
40
20
10
結(jié)果說明:該示例中的棧,是通過"數(shù)組"來實(shí)現(xiàn)的!
由于代碼中已經(jīng)給出了詳細(xì)了注釋,這里就不再對函數(shù)進(jìn)行說明了。僅對主函數(shù)main的邏輯進(jìn)行簡單介紹:
在主函數(shù)main中,先將 "10, 20, 30"依次壓入棧。此時(shí),棧的數(shù)據(jù)是:30→20→10。
接著通過pop()返回棧頂元素;pop()操作并不會改變棧中的數(shù)據(jù)。此時(shí),棧的數(shù)據(jù)依然是:30→20→10。
接著通過peek()返回并刪除棧頂元素。peek操作之后,棧的數(shù)據(jù)是:20→10。接著通過push(40)將40壓
入棧中。push(40)操作之后,棧的數(shù)據(jù)是:40→20→10。
實(shí)現(xiàn)代碼:
代碼說明:"運(yùn)行結(jié)果" 以及 "主函數(shù)main的邏輯"都和"C語言實(shí)現(xiàn)一"的一樣。不同的是,該示例中的棧是通過單向鏈表實(shí)現(xiàn)的。
實(shí)現(xiàn)代碼:
(1)雙向鏈表的頭文件(double_link.h)
(2)雙向鏈表的實(shí)現(xiàn)文件double_link.c)
(3)雙向鏈表的測試程序(dlink_stack.c)
代碼說明:"運(yùn)行結(jié)果" 以及 "主函數(shù)main的邏輯"都和前兩個(gè)示例的一樣。不同的是,該示例中的棧是通過雙向鏈表實(shí)現(xiàn)的。
實(shí)現(xiàn)代碼:
(1)雙向鏈表的頭文件(double_link.h)
(2)雙向鏈表的實(shí)現(xiàn)文件(double_link.c)
(3)雙向鏈表的測試程序(dlink_stack.c)
運(yùn)行結(jié)果:
id=40, name=dan
id=20, name=jody
id=10, name=sky
結(jié)果說明:該示例中的棧是通過雙向鏈表實(shí)現(xiàn)的,并且能存儲任意類型的數(shù)據(jù)。示例中是以結(jié)構(gòu)體類型的數(shù)據(jù)進(jìn)行演示的,由于代碼中已經(jīng)給出了詳細(xì)的注釋,這里就不再介紹了。
-END-
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!