亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

深入淺析C語言中堆棧和隊列

2020-01-26 14:32:23
字體:
來源:轉載
供稿:網友

1.堆和棧

(1)數據結構的堆和棧

堆棧是兩種數據結構。

棧(棧像裝數據的桶或箱子):是一種具有后進先出性質的數據結構,也就是說后存放的先取,先存放的后取。這就如同要取出放在箱子里面底下的東西(放入的比較早的物體),首先要移開壓在它上面的物體(放入的比較晚的物體)。

堆(堆像一棵倒過來的樹):是一種經過排序的樹形數據結構,每個結點都有一個值。通常所說的堆的數據結構,是指二叉堆。堆的特點是根結點的值最?。ɑ蜃畲螅腋Y點的兩個子樹也是一個堆。由于堆的這個特性,常用來實現優先隊列,堆的存取是隨意,這就如同在圖書館的書架上取書,雖然書的擺放是有順序的,但是想取任意一本時不必像棧一樣,先取出前面所有的書,書架這種機制不同于箱子,我們可以直接取出我們想要的書。

(2)內存分配中的堆和棧

C語言程序內存分配中的堆和棧。C語言程序經過編譯連接后形成編譯、連接后形成的二進制映像文件由棧,堆,數據段(由三部分部分組成:只讀數據段,已經初始化讀寫數據段,未初始化數據段即BBS)和代碼段組成,如下圖所示:

棧區:處于相對較高的地址,以地址的增長方向為上的話,棧地址是向下增長的;

堆區:是向上增長的用于分配程序員申請的內存空間。

一個例子:

main.cpp int a = 0; 全局初始化區 char *p1; 全局未初始化區 main() {  int b; 棧  char s[] = "abc"; 棧  char *p2; 棧  char *p3 = "123456"; //123456/0在常量區,p3在棧上。  static int c =0; 全局(靜態)初始化區  p1 = (char *)malloc(10); 堆  p2 = (char *)malloc(20); 堆 }

堆和棧的區別:

(a)申請方式和回收方式不同
1)棧(satck):由系統自動分配。例如,聲明在函數中一個局部變量int b;系統自動在棧中為b開辟空間。
2)堆(heap):需程序員自己申請(調用malloc,realloc,calloc),并指明大小,并由程序員進行釋放。容易產生memory leak.
例如: char  *p;

         p = (char *)malloc(sizeof(char));

但是,p本身是在棧中。

由于棧上的空間是自動分配自動回收的,所以棧上的數據的生存周期只是在函數的運行過程中,運行后就釋放掉,不可以再訪問。而堆上的數據只要程序員不釋放空間,就一直可以訪問到,不過缺點是一旦忘記釋放會造成內存泄露。

(b)申請后系統的響應

1)棧:只要棧的空間大于所申請空間,系統將為程序提供內存,否則將報異常提示棧溢出。

2)堆:首先應該知道操作系統有一個記錄空閑內存地址的鏈表,但系統收到程序的申請時,會遍歷該鏈表,尋找第一個空間大于所申請空間的堆結點,然后將該結點從空閑鏈表中刪除,并將該結點的空間分配給程序,另外,對于大多數系統,會在這塊內存空間中的首地址處記錄本次分配的大小,這樣,代碼中的free語句才能正確的釋放本內存空間。另外,找到的堆結點的大小不一定正好等于申請的大小,系統會自動的將多余的那部分重新放入空閑鏈表中。
說明:對于堆來講,頻繁的new/delete勢必會造成內存空間的不連續,從而造成大量的碎片,使程序效率降低。對于棧來講,則不會存在這個問題。

堆會在申請后還要做一些后續的工作這就會引出申請效率的問題。

(c)申請效率
1)棧由系統自動分配,速度快。但程序員是無法控制。
2)堆是由malloc分配的內存,一般速度比較慢,而且容易產生碎片,不過用起來最方便。

(d)申請大小的限制

1)棧:在Windows下,棧是向低地址擴展的數據結構,是一塊連續的內存的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在Windows下,棧的大小是2M(也有的說是1M,總之是一個編譯時就確定的常數),如果申請的空間超過棧的剩余空間時,將提示overflow。因此,能從棧獲得的空間較小。 

2)堆:堆是向高地址擴展的數據結構,是不連續的內存區域。這是由于系統是用鏈表來存儲的空閑內存地址的,自然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限于計算機系統中有效的虛擬內存。由此可見,堆獲得的空間比較靈活,也比較大。

(e)堆和棧中的存儲內容

1)棧: 在函數調用時,第一個進棧的是主函數中函數調用后的下一條指令(函數調用語句的下一條可執行語句)的地址,然后是函數的各個參數,在大多數的C編譯器中,參數是由右往左入棧的,然后是函數中的局部變量。注意靜態變量是不入棧的。 
當本次函數調用結束后,局部變量先出棧,然后是參數,最后棧頂指針指向最開始存的地址,也就是主函數中的下一條指令,程序由該點繼續運行。 

2)堆:一般是在堆的頭部用一個字節存放堆的大小。堆中的具體內容有程序員安排。

(f)存取效率

1)堆:char *s1=”hellow tigerjibo”;是在編譯是就確定的;

2)棧:char s1[]=”hellow tigerjibo”;是在運行時賦值的;用數組比用指針速度更快一些,指針在底層匯編中需要用edx寄存器中轉一下,而數組在棧上讀取。

補充:

棧是機器系統提供的數據結構,計算機會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。堆則是C/C++函數庫提供的,它的機制是很復雜的,例如為了分配一塊內存,庫函數會按照一定的算法(具體的算法可以參考數據結構/操作系統)在堆內存中搜索可用的足夠大小的空間,如果沒有足夠大小的空間(可能是由于內存碎片太多),就有可能調用系統功能去增加程序數據段的內存空間,這樣就有機會分到足夠大小的內存,然后進行返回。顯然,堆的效率比棧要低得多。

(g)分配方式:

1)堆都是動態分配的,沒有靜態分配的堆。

2)棧有兩種分配方式:靜態分配和動態分配。靜態分配是編譯器完成的,比如局部變量的分配。動態分配由alloca函數進行分配,但是棧的動態分配和堆是不同的。它的動態分配是由編譯器進行釋放,無需手工實現。

最后,關于棧和堆一個形象的比喻:

使用棧就象我們去飯館里吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,好處是快捷,但是自由度小。

使用堆就象是自己動手做喜歡吃的菜肴,比較麻煩,但是比較符合自己的口味,而且自由度大。

2.堆棧和隊列(數據結構)

(1)堆棧

基本概念

(a)定義:限定只能在固定一端進行插入和刪除操作的線性表。
特點:后進先出。

(b)允許進行插入和刪除操作的一端稱為棧頂,另一端稱為棧底。
作用:可以完成從輸入數據序列到某些輸出數據序列的轉換。

堆棧抽象數據類型

數據集合: 
{a0,a1,…,an-1} ,ai的數據類型為DataType。

操作集合:

(a) StackInitiate(S) :初始化堆棧S
(b) StackNotEmpty(S):堆棧S非空否
(c)StackPush(S, x) :入棧
(d)StackPop(S, d):出棧
(e)StackTop(S, d):取棧頂數據元素

堆棧類型

(a)順序堆棧

順序堆棧:順序存儲結構的堆棧。
順序棧的存儲結構:利用一組地址連續的存儲單元依次存放自棧底到棧頂的數據元素。

數據結構:

typedef struct{ DataTypestack[MaxStackSize]; int top;}SeqStack;

(b)鏈式堆棧

鏈式堆棧:鏈式存儲結構的堆棧。

鏈式棧的存儲結構:它是以頭指針為棧頂,在頭指針處插入或刪除,帶頭結點的鏈式堆棧結構:



鏈棧中每個結點由兩個域構成:data域和next域。

結點結構體定義如下亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

亚洲午夜久久久久久久| 91高清免费在线观看| 91在线精品视频| 欧美限制级电影在线观看| 狠狠爱在线视频一区| 日韩中文字幕在线看| 91精品国产综合久久香蕉922| 91av网站在线播放| 久久躁日日躁aaaaxxxx| 午夜精品一区二区三区在线视频| 欧美日韩成人在线播放| 国产精品看片资源| 91黑丝高跟在线| 亚洲第一区第一页| 国产综合久久久久| 精品久久久久久亚洲国产300| 欧美激情亚洲综合一区| 欧美日韩国产二区| 在线播放国产一区中文字幕剧情欧美| 国产精品美女久久| 日本一区二区在线免费播放| 久久精品国产电影| 亚洲美女视频网| 午夜精品福利在线观看| 亚洲欧美国产日韩中文字幕| 久久夜色精品亚洲噜噜国产mv| 亚洲成人激情在线观看| 久久久久久999| 国产成人精品视频在线| 96国产粉嫩美女| 97精品欧美一区二区三区| 国产成人久久久| 精品国产自在精品国产浪潮| 亚洲成色777777在线观看影院| 欧美在线免费观看| 欧美二区乱c黑人| 91精品久久久久久久久中文字幕| 日韩在线观看网址| 成人97在线观看视频| 亚洲精品美女久久久久| 欧美日韩国产在线| 国产精品扒开腿做爽爽爽男男| 亚洲精品www久久久久久广东| 国产不卡av在线免费观看| 中文字幕av一区二区| 亚洲欧洲免费视频| 国产精品成久久久久三级| 亚洲精品美女免费| 欧美中文在线免费| 88xx成人精品| 国产精品免费看久久久香蕉| 黑人与娇小精品av专区| 欧美午夜片欧美片在线观看| 欧美成人激情视频| 美日韩精品视频免费看| 亚洲性猛交xxxxwww| 国产精品丝袜久久久久久不卡| 在线看片第一页欧美| 91精品国产99久久久久久| 91av网站在线播放| 一区二区三区动漫| 久久久999精品免费| 国语自产在线不卡| 日本伊人精品一区二区三区介绍| 久久69精品久久久久久久电影好| 国产精品日韩在线一区| 懂色av中文一区二区三区天美| 日韩av男人的天堂| 国产91成人在在线播放| 日韩a**中文字幕| 国产欧美精品va在线观看| 91日本视频在线| www.日韩免费| 一区二区三区四区视频| 亚洲2020天天堂在线观看| 国产精品视频免费在线| 欧洲成人在线观看| 日韩中文字幕在线视频播放| 精品国产依人香蕉在线精品| 中文字幕日韩欧美精品在线观看| 亚洲天堂男人天堂| 久久久亚洲成人| 日韩的一区二区| 午夜美女久久久久爽久久| 精品久久久久久中文字幕大豆网| 精品国内产的精品视频在线观看| 久久精品视频免费播放| 亚洲欧美一区二区三区四区| 亚洲黄页视频免费观看| 国产91在线高潮白浆在线观看| 亚洲最新av网址| 亚洲人高潮女人毛茸茸| 日韩欧美视频一区二区三区| 亚洲女人天堂网| 国产精品91在线| 亚洲国产成人在线播放| 亚洲男人天堂九九视频| www.欧美精品一二三区| 久久久久久香蕉网| 中文字幕久热精品在线视频| 亚洲成人1234| 91久久久久久久久久久久久| 日韩av在线看| 自拍偷拍亚洲精品| 精品国产乱码久久久久酒店| 97在线视频免费| 成人福利网站在线观看11| 国产日韩欧美黄色| 成人有码视频在线播放| 国产va免费精品高清在线| 国产欧美一区二区三区在线看| 韩国三级日本三级少妇99| 国产精品福利片| 91精品中国老女人| 久久精品视频免费播放| 超碰精品一区二区三区乱码| 国产成人亚洲精品| 欧美性在线观看| 美女av一区二区三区| 久久久精品999| 亚洲欧洲在线视频| 欧美激情a∨在线视频播放| 91精品在线观| 欧美综合在线第二页| 日韩国产精品一区| 亚洲精品不卡在线| 国产精品福利小视频| 97精品国产97久久久久久| 日日狠狠久久偷偷四色综合免费| 欧美午夜激情视频| 国产精品免费一区豆花| 久久久久久久久久亚洲| 欧美成人免费在线视频| 国产精品成人播放| 久久视频国产精品免费视频在线| 精品国产区一区二区三区在线观看| 日韩国产中文字幕| 国产亚洲欧美aaaa| 欧美激情影音先锋| 69视频在线免费观看| 一本一本久久a久久精品牛牛影视| 性欧美在线看片a免费观看| 国产一区二区三区丝袜| 久久久久国产精品免费网站| 国产成人精品国内自产拍免费看| 欧美精品日韩三级| 91在线视频导航| 久久精品成人动漫| 成人亚洲综合色就1024| 国产精品激情自拍| 97免费视频在线播放| 国模吧一区二区三区| 另类美女黄大片| 久久精品精品电影网| wwwwwwww亚洲| 2019国产精品自在线拍国产不卡| 韩剧1988免费观看全集| 欧美成人午夜剧场免费观看| 亚洲国产精品小视频| 国产精品一区二区三区久久| 国产精品久久久久久久电影| 成人乱人伦精品视频在线观看| 国产91久久婷婷一区二区| 国产福利精品在线|