【数据结构/操作系统 堆和栈】区别及应用场景、底层原理图解

堆和栈

比较有趣的是,计算机网络、操作系统中都会对堆栈有不同方面比较详细的描述,而使用的地方通常对这些底层的细节表现得没有那么明显。
但如果你能了解堆栈在计算机网络和操作系统中的表现形式,在你写代码时就会有不一样的认识(这里的代码以C++为例)。

数据结构中的堆和栈

堆(Heap)和栈(Stack)是两种不同的数据结构,它们在计算机科学中有不同的用途和实现方式。

堆(Heap)

堆通常被实现为二叉树结构(最常见的是二叉堆),但它并不等同于一般的二叉树。堆是一种特殊的完全二叉树,其中每个节点的值都大于或等于(最大堆)或小于或等于(最小堆)其子节点的值。堆主要用于实现优先队列,其中每次移除的元素都是当前集合中最大(或最小)的元素。

堆的操作主要包括:
  1. 插入(Insert):向堆中添加一个新元素,并保持堆的性质。
  2. 删除(Delete):移除并返回堆中的最大(或最小)元素,然后重新调整堆以保持其性质。
  3. 堆化(Heapify):将一个数组转换为堆,或重新调整堆以维持其性质。

堆通常用于实现内存管理、图算法(如Dijkstra算法中的优先队列)、堆排序等。

栈(Stack)

栈是一种遵循后进先出(LIFO)原则的有序集合。它只允许在栈顶进行添加(push)或删除(pop)元素的操作。栈的实现可以是基于数组的,也可以是基于链表的。

栈的操作主要包括:
  1. push:将一个元素添加到栈顶。
  2. pop:移除栈顶的元素,并返回该元素。
  3. peek/top:返回栈顶的元素,但不从栈中移除它。
  4. isEmpty:检查栈是否为空。
  5. size:返回栈中元素的数量。

栈在多种编程场景中都有广泛的应用,如函数调用、表达式求值、语法分析、浏览器历史记录等。

总结

堆和栈是两种不同的数据结构,它们在计算机科学中扮演着不同的角色。堆主要用于实现优先队列和其他需要快速访问最大(或最小)元素的场景,而栈则主要用于需要后进先出访问顺序的场景。

操作系统中的堆和栈

这里直接以两位大佬的公开资料为例:图来自小林,表来自阿秀

先看表:

原谅我偷个懒,不画表了
来自阿秀

再看图:(看完再两个一起看看

来自小林
来自小林

总结

  1. 管理方式:主要是和代码相关的,教你怎么在代码中涉及堆和栈;
  2. 内存管理:可以结合数据结构来看,会涉及到一些工作中的问题的处理以及面试问题;
  3. 空间大小:操作系统底层;
  4. 碎片问题:操作系统底层,这个很复杂的,操作系统中涉及内存的所有内容都离不开碎片管理这个问题,对于碎片管理,一般都是采用的重分配机制处理,这里就不展开了;
  5. 生长方向:结合图片看,很清晰;
  6. 分配方式:小林对底层有详细展开,就是我拿的第二张图片的后面部分,很多很细,推荐去看;
  7. 分配效率:结合图片看;

多理解吧~
底层涉及真的很多~
开发过程中其实就涉及数据结构那块;
面试交流会涉及操作系统;
至于操作系统底层,欢迎去学习!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

flos chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值