堆和栈
比较有趣的是,计算机网络、操作系统中都会对堆栈有不同方面比较详细的描述,而使用的地方通常对这些底层的细节表现得没有那么明显。
但如果你能了解堆栈在计算机网络和操作系统中的表现形式,在你写代码时就会有不一样的认识(这里的代码以C++为例)。
数据结构中的堆和栈
堆(Heap)和栈(Stack)是两种不同的数据结构,它们在计算机科学中有不同的用途和实现方式。
堆(Heap)
堆通常被实现为二叉树结构(最常见的是二叉堆),但它并不等同于一般的二叉树。堆是一种特殊的完全二叉树,其中每个节点的值都大于或等于(最大堆)或小于或等于(最小堆)其子节点的值。堆主要用于实现优先队列,其中每次移除的元素都是当前集合中最大(或最小)的元素。
堆的操作主要包括:
- 插入(Insert):向堆中添加一个新元素,并保持堆的性质。
- 删除(Delete):移除并返回堆中的最大(或最小)元素,然后重新调整堆以保持其性质。
- 堆化(Heapify):将一个数组转换为堆,或重新调整堆以维持其性质。
堆通常用于实现内存管理、图算法(如Dijkstra算法中的优先队列)、堆排序等。
栈(Stack)
栈是一种遵循后进先出(LIFO)原则的有序集合。它只允许在栈顶进行添加(push)或删除(pop)元素的操作。栈的实现可以是基于数组的,也可以是基于链表的。
栈的操作主要包括:
- push:将一个元素添加到栈顶。
- pop:移除栈顶的元素,并返回该元素。
- peek/top:返回栈顶的元素,但不从栈中移除它。
- isEmpty:检查栈是否为空。
- size:返回栈中元素的数量。
栈在多种编程场景中都有广泛的应用,如函数调用、表达式求值、语法分析、浏览器历史记录等。
总结
堆和栈是两种不同的数据结构,它们在计算机科学中扮演着不同的角色。堆主要用于实现优先队列和其他需要快速访问最大(或最小)元素的场景,而栈则主要用于需要后进先出访问顺序的场景。
操作系统中的堆和栈
这里直接以两位大佬的公开资料为例:图来自小林,表来自阿秀;
先看表:
原谅我偷个懒,不画表了 |
---|
再看图:(看完再两个一起看看
总结
- 管理方式:主要是和代码相关的,教你怎么在代码中涉及堆和栈;
- 内存管理:可以结合数据结构来看,会涉及到一些工作中的问题的处理以及面试问题;
- 空间大小:操作系统底层;
- 碎片问题:操作系统底层,这个很复杂的,操作系统中涉及内存的所有内容都离不开碎片管理这个问题,对于碎片管理,一般都是采用的重分配机制处理,这里就不展开了;
- 生长方向:结合图片看,很清晰;
- 分配方式:小林对底层有详细展开,就是我拿的第二张图片的后面部分,很多很细,推荐去看;
- 分配效率:结合图片看;
多理解吧~
底层涉及真的很多~
开发过程中其实就涉及数据结构那块;
面试交流会涉及操作系统;
至于操作系统底层,欢迎去学习!