堆和栈的区别

堆和栈的区别

堆是一颗完全二叉树,在这棵树中,所有父节点都满足大于等于其子节点的堆叫大根堆,所有父节点都满足小于等于其子节点的堆叫小根堆。堆虽然是一颗树,但是通常存放在一个数组中,父节点和孩子节点的父子关系通过数组下标来确定。

堆是一棵完全二叉树(若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边),定义为:具有n个元素的序列(h1,h2,…hn),当且仅当满足(hi>=h2i,hi>=h2i+1)或(hi<=h2i,hi<=2i+1) (i=1,2,…,n/2)时称之为堆。

大顶堆
堆顶元素(即第一个元素)为最大项,并且(hi>=h2i,hi>=h2i+1)

小顶堆
堆顶元素为最小项,并且(hi<=h2i,hi<=2i+1)

1、栈的基本概念
栈是一种特殊的线性表,只允许在表的一端进行插入和删除的线性表;插入,删除的一端为栈顶,另一端为栈底;当表中没有元素时为空栈。
栈是一种后进先出(或先进后出Last In First Out)的线性表。栈具有记忆功能。栈的实例:火车调度,子弹夹。

2、栈的存储结构
顺序存储结构:用一组地址连续的存储单元即一维数组来存储;
链式存储:用线性链表来存储;

3、栈的基本运算
(1) 入栈运算,在栈顶位置插入元素;
(2) 退栈运算,删除元素(取出栈顶元素并赋给一个指定的变量);
(3) 读栈顶元素,将栈顶元素赋给一个指定的变量,此时指针无变化。

堆和栈的区别

1、堆栈空间分配区别

栈(操作系统):由操作系统(编译器)自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。

2、堆栈缓存方式区别

栈使用的是一级缓存, 它们通常都是被调用时处于存储空间中,调用完毕立即释放。

堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。

3、堆栈数据结构区别

堆(数据结构):堆可以被看成是一棵树,如:堆排序。

栈(数据结构):一种先进后出的数据结构。

4、申请的大小方面

栈空间比较小;

堆空间比较大。

5、数据存储方面

栈空间中一般存储基本数据类型,对象的地址;

堆空间一般存放对象本身,block的copy等。

堆和栈的区别
堆是由低地址向高地址扩展,栈是由高地址向低地址扩展。

堆中内存需要手动申请和手动释放,栈中内存由OS自动申请,自动释放,存放着参数局部变量等内存。

堆中频繁调动malloc和free,会产生内存碎片,降低程序效率。栈采用先进后出原则,不会产生内存碎片。

堆的分配效率较低,栈的分配效率较高。

栈的效率更高的原因:
栈是操作系统提供的数据结构,计算机底层对栈提供了一系列支持:分配专门的寄存器存储栈的地址,压栈和入栈有专门的指令执行;而堆是由c/c++函数库提供的,需要一些列来分配内存合并内存和释放内存的算法,因此效率较低。

参考文章:
堆和栈的区别是什么
堆和栈的区别是什么?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值