C++:4.0 混淆概念(1)堆和栈

1、堆和栈分为:

  1) 数据结构中的堆、栈;

   堆:类似于一个完全二叉树

   栈:后进先出

   队列:先进先出

 

  2) 内存使用中的堆、栈;(即:堆区 栈区

   栈区(stack):由编译器自动分配释放,存储函数的参数值、局部变量的值等;

   堆区(heap):由程序员分配释放,若程序员不释放,程序结束时可能由系统回收,也是C++内存溢出的原因之一

   申请效率:

      栈由系统自动分配,速度较快,但程序员无法控制;

      堆通过new分配,一般速度较慢,但用起来很方便;

 

2、针对内存使用中的堆区和栈区的空间分配:

  C/C++中占用的内存分为五个部分:栈区、堆区、全局区(静态区)、文字常量区、程序代码区。

  -- 栈区:编译器自动分配释放,存放函数的参数值,局部变量的值等。

  -- 堆区:由程序员分配释放,若程序员不释放,则当程序结束时由OS回收。    

  -- 全局区(静态区):全局变量和静态变量的存储放在一起。

            初始化的全局变量和静态变量在一块区域;

            未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。

  -- 文字常量区:存放常量字符串,程序结束后由系统释放。

  -- 程序代码区:存放函数体的二进制代码。

 # include<iostream.h>
# include<string.h>
# include<stdlib.h>

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

posted @ 2021-01-21 15:01  张幼安  阅读(86)  评论(0编辑  收藏  举报