堆和栈

在不同的场景下,堆和栈代表不同的含义。一般情况下,有两层含义:1、程序内存布局情况下,栈和堆表示两种内存管理方式; 2、数据结构场景下,堆和栈表示两种常用的数据结构。

1.程序内存分区中的堆和栈
栈简介:栈由操作系统自动分配释放,用于存放函数的函数值、局部变量等,其操作方式类似于数据结构中的栈。
堆简介:堆由开发人员分配和释放,若开发人员不释放,程序结束时由OS回收,分配方式类似于链表。

堆和栈的区别
(1)管理方式不同。栈由操作系统自动分配释放,无需我们手动控制;堆的申请和释放由程序员控制,容易产生内存泄漏。
(2)空间大小不同。每个进程拥有的栈的大小要远远小于堆的大小。理论上程序员可申请的堆的大小为虚拟内存的大小。
(3)生长方向不同。堆的生长方向向上,内存地址由低到高;栈的生长方向向下,内存地址由高到低。
(4)分配方式不同。堆都是动态分配的。栈有两种分配方式:静态分配和动态分配。静态分配是由操作系统完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,它的动态分配是由操作系统进行释放,无需我们手工实现。
(5)分配效率不同。栈由操作系统自动分配,会在硬件层级对栈提供支持,分配专门的寄存器存放栈的地址压栈出栈都有专门的指令执行。堆则是由C/C++提供的库函数或运算符来完成生成与管理,实现机制较为复杂,频繁的内存申请容易产生内存碎片。所有,堆的效率要比栈低得多。
(6)存放的内容不同。栈存放的内容:函数返回地址、相关参数、局部变量和寄存器内容等。而堆的具体存放内容由程序员来定。

数据结构中的堆和栈

数据结构中的栈是运算受限的线性表,其限制是指只允许在一端进行插入和删除操作,这一端被称为栈顶(Top),相对的,把另一端称为栈底(Bottom)。把新元素放到栈顶元素的上面,使之成为新的栈顶元素做入栈和压栈(push);把栈顶元素删除,使之相邻的元素成为新的栈顶元素称为出栈。这种受限的运算使栈拥有先进后出的特性。

栈分为顺序栈和链式栈。栈是一种线性结构,所以可以使用数组或链表(单向链表、双向链表、循环链表)作为底层数据结构。使用数组实现的栈叫顺序栈,使用链表实现的栈叫做链式栈,二者的区别是顺序栈中的元素地址连续,链式栈中的元素地址不连续。

堆的性质:
堆是一种常用的树形结构,是一种特殊的完全二叉数,当且仅当满足所有节点的值总是不大于或不小于其父节点的值的完全二叉树被称为堆。堆的这一特性称之为堆序性。因此,在一个堆中,根节点是最大(或最小)节点。如果根节点最小,称为小顶堆,反之,称为大顶堆。堆的左右孩子没有大小顺序。

堆的存储一般都用数组来存储堆,i节点的父节点下标就为(i-1)/2。它的左右子节点下标分别为2i+1和2i+2。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值