【数据结构】堆栈 ⟳
堆(heap)⟳
-
堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:
- 堆中某个节点的值总是不大于或不小于其父节点的值;
- 堆总是一棵完全二叉树。
根节点最大的堆叫做最大堆、大根堆或大顶堆
根节点最小的堆叫做最小堆、小根堆或小顶堆
常见的堆还有二叉堆、斐波那契堆等。 -
堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即 动态分配内存,对其访问和对一般内存的访问没有区别。
-
堆是应用程序在运行的时候请求操作系统分配给自己内存,一般是申请/给予的过程。
-
堆是指程序运行时申请的动态内存,而栈只是指一种使用堆的方法(即 先进后出)。
栈(stack)⟳
-
栈又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。
-
栈就是一个桶,后放进去的先拿出来,它下面本来有的东西要等它出来之后才能出来(先进后出)
-
栈是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有FILO(First In Last Out)的特性,在编译的时候可以指定需要的Stack的大小。
区别⟳
- 空间分配
- 堆(操作系统):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。
- 栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
- 缓存方式
- 堆:存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。
- 栈:使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放。
- 数据结构
- 堆(数据结构):堆可以被看成是一棵树,如:堆排序。
- 栈(数据结构):一种先进后出,后进先出的数据结构。
- 存取方式
- 堆:随意存取。常用来实现优先队列,先进先出。这就如同我们在图书馆的书架上取书,我们可以直接取出我们想要的书
- 栈:先进后出,后进先出。这就如同我们要取出放在箱子里面底下的东西(放入的比较早的物体),我们首先要移开压在它上面的物体(放入的比较晚的物体)
- 存储方式
- 堆:从低地址写到高地址,是不连续的内存区域,如int数组{1, 2, 3 ,4, 5},存储地址则依次为0, 4, 8, 12, 16
- 栈:从高地址写到低地址,是一段连续的内存区域,如存储数据1234,存储地址则依次为高地址12,低地址34
其实也很好理解,读取数据从高位到低位顺着读入进去,运算时却是从低位到高位运算,所以栈从高地址写到低地址,而从低地址到高地址读出。
如图:
请你务必,一而再,再而三,三而不竭,千次万次,毫不犹豫地救自己于这世间水火。
笔者将不定期更新【考研或就业】的专业相关知识以及自身理解,希望大家能【关注】我。
如果觉得对您有用,请点击左下角的【点赞】按钮,给我一些鼓励,谢谢!
如果有更好的理解或建议,请在【评论】中写出,我会及时修改,谢谢啦!
笔者将不定期更新【考研或就业】的专业相关知识以及自身理解,希望大家能【关注】我。
如果觉得对您有用,请点击左下角的【点赞】按钮,给我一些鼓励,谢谢!
如果有更好的理解或建议,请在【评论】中写出,我会及时修改,谢谢啦!
本文来自博客园,作者:Nemo&
转载请注明原文链接:https://www.cnblogs.com/blknemo/p/10216917.html
顶
关注
评论
收藏
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!