1. 程式人生 > 實用技巧 >C++:4.0 混淆概念(1)堆和棧

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