C++:4.0 混淆概念(1)堆和棧
1、堆和棧分為:
1) 資料結構中的堆、棧;
堆:類似於一個完全二叉樹
棧:後進先出
佇列:先進先出
2) 記憶體使用中的堆、棧;(即:堆區 和 棧區)
棧區(stack):由編譯器自動分配釋放,儲存函式的引數值、區域性變數的值等;
堆區(heap):由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由系統回收,也是C++記憶體溢位的原因之一
申請效率:
棧由系統自動分配,速度較快,但程式設計師無法控制;
堆通過new分配,一般速度較慢,但用起來很方便;
2、針對記憶體使用中的堆區和棧區的空間分配:
C/C++中佔用的記憶體分為五個部分:棧區、堆區、全域性區(靜態區)、文字常量區、程式程式碼區。
1 int a = 0; // 全域性區 2 char *p1; // 全域性區 3 4 void main() 5 { 6 int b; // 棧區 7 char s[] = "abc"; // 棧區 8 char *p2; // 棧區 9 char *p3 = "123456"; // 123456在常量區, p3在棧區 10 static int c = 0; //全域性(靜態)初始化區 11 p1 = (char *)malloc(10); 12 p2 = (char *)malloc(20); // 程式設計師分配,堆區 13 }
3、針對資料結構中的堆和棧:(+佇列)
1)堆:
堆是一種經過排序的樹形資料結構,每個節點都有一個值。通常我們所說的堆的資料結構是指二叉樹。
堆通常有如下兩個性質:
(1)堆是一棵完全二叉樹;
(2)堆中子節點的值總是不大於其父節點的值,或者總是小於其父節點的值;
堆分為大根堆(最大堆)和小根堆(最小堆);
大根堆指父節點中的元素一定比子節點的元素要大
小根堆指父節點中的元素一定比子節點的元素要小
2)棧:(後進先出)
棧 是僅能在表尾進行插入和刪除操作的線性表。
允許插入和刪除的一端成為棧頂,另一端稱為棧底,不含任何資料元素的棧稱為空棧。
棧中定義了兩個操作:PUSH和POP
PUSH操作在堆疊頂加入元素;POP操作在堆疊頂移去元素,且堆疊大小減一。
3)佇列:(先進先出)
佇列只允許在一端進行插入操作,而在另一端進行刪除操作的線性表。
允許插入的一端稱為隊尾,允許刪除的一端稱為對頭。
參考:
https://blog.csdn.net/u012351051/article/details/80821400
https://www.jianshu.com/p/5f148c3e4f7d
https://blog.csdn.net/qq_38089394/article/details/70838033