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