C語言棧的圖文解析和實現

棧(stack),是一種線性存儲結構,它有以下幾個特點:
棧中數據是按照"后進先出(LIFO, Last In First Out)"方式進出棧的。
向棧中添加/刪除數據時,只能從棧頂進行操作。
棧通常包括的三種操作:push、peek、pop。
push——向棧中添加元素。
peek——返回棧頂元素。
pop——返回并刪除棧頂元素的操作。
1. 棧的示意圖

棧中的數據依次是30→20→10。
2. 出棧

出棧前:棧頂元素是30。此時,棧中的元素依次是30→20→10。
出棧后:30出棧之后,棧頂元素變成20。此時,棧中的元素依次是20→10。
3. 入棧

入棧前:棧頂元素是20。此時,棧中的元素依次是20→10。
入棧后:40入棧之后,棧頂元素變成40。此時,棧中的元素依次是 40→20→10。
實現代碼:

運行結果:
tmp=30tmp=20stack size()=3402010
結果說明:該示例中的棧,是通過"數組"來實現的!
由于代碼中已經給出了詳細了注釋,這里就不再對函數進行說明了。僅對主函數main的邏輯進行簡單介紹:
在主函數main中,先將 "10, 20, 30"依次壓入棧。此時,棧的數據是:30→20→10。
接著通過pop()返回棧頂元素;pop()操作并不會改變棧中的數據。此時,棧的數據依然是:30→20→10。
接著通過peek()返回并刪除棧頂元素。peek操作之后,棧的數據是:20→10。接著通過push(40)將40壓
入棧中。push(40)操作之后,棧的數據是:40→20→10。
實現代碼:

代碼說明:"運行結果" 以及 "主函數main的邏輯"都和"C語言實現一"的一樣。不同的是,該示例中的棧是通過單向鏈表實現的。
實現代碼:
(1)雙向鏈表的頭文件(double_link.h)

(2)雙向鏈表的實現文件double_link.c)



(3)雙向鏈表的測試程序(dlink_stack.c)

代碼說明:"運行結果" 以及 "主函數main的邏輯"都和前兩個示例的一樣。不同的是,該示例中的棧是通過雙向鏈表實現的。
實現代碼:
(1)雙向鏈表的頭文件(double_link.h)

(2)雙向鏈表的實現文件(double_link.c)




(3)雙向鏈表的測試程序(dlink_stack.c)

運行結果:
id=40, name=danid=20, name=jodyid=10, name=sky
結果說明:該示例中的棧是通過雙向鏈表實現的,并且能存儲任意類型的數據。示例中是以結構體類型的數據進行演示的,由于代碼中已經給出了詳細的注釋,這里就不再介紹了。
-END-
免責聲明:本文內容由21ic獲得授權后發(fā)布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯系我們,謝謝!






