您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

计算机世界里的“堆栈”你真的懂吗?

时间:2020-09-10 10:01:05  来源:  作者:

如果你学过数据结构,就一定会遇到“堆”,"栈","堆栈",这些对于小白来说有些头大,下面就来科普一下何谓堆栈?

 

按照WIKI的定义:

 

堆栈(英语:stack),是计算机科学中一种特殊的串列形式的抽象数据类型,其特殊之处在于只能允许在链表或数组的一端(称为堆栈顶端指针,英语:top)进行加入数据(英语:push)和输出数据(英语:pop)的运算。另外堆栈也可以用一维数组或链表的形式来完成。堆栈的另外一个相对的操作方式称为队列。需要记住的是,堆:顺序随意,栈:后进先出(Last-In/First-Out)。

 

计算机世界里的“堆栈”你真的懂吗?

 

 

这里的pop和push到都是什么意思?其实这是堆栈数据结构使用两种基本操作:推入(压栈,push)和弹出(弹栈,pop):

 

推入:将数据放入堆栈的顶端(数组形式或串列形式),堆栈顶端top指针加一。

弹出:将顶端数据数据输出(回传),堆栈顶端数据减一。

 

计算机世界里的“堆栈”你真的懂吗?

 

 

如要了解堆栈,应将之拆开分析。

 

的概念:

 

堆(英语:Heap)是计算机科学中的一种特别的树状数据结构。通常是一个可以被看做一棵树的数组对象。若是满足以下特性,即可称为堆:“给定堆中任意节点 P 和 C,若 P 是 C 的父节点,那么 P 的值会小于等于(或大于等于) C 的值”。若父节点的值恒小于等于子节点的值,此堆称为最小堆(英语:min heap);反之,若父节点的值恒大于等于子节点的值,此堆称为最大堆(英语:max heap)。在堆中最顶端的那一个节点,称作根节点(英语:root node),根节点本身没有父节点(英语:parent node)。

 

计算机世界里的“堆栈”你真的懂吗?

 

 

栈的概念

 

栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。栈就是一个桶,后放进去的先拿出来,它下面本来有的东西要等它出来之后才能出来(先进后出)

 

栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有FIFO的特性,在编译的时候可以指定需要的Stack的大小。

 

计算机世界里的“堆栈”你真的懂吗?

 

 

堆栈

 

其实堆栈本身就是栈,只是换了个抽象的名字。其特性是: 最后一个放入堆栈中的物体总是被最先拿出来,这个特性通常称为后进先出(LIFO)队列。堆栈中定义了一些操作。 两个最重要就是上述提到的PUSH和POP。PUSH操作在堆栈的顶部加入一个元素,POP操作相反,在堆栈顶部移去一个元素,并将堆栈的大小减一。

 

计算机世界里的“堆栈”你真的懂吗?

 

 

工作原理

 

对于工作方式你可能还是一头雾水,以自助餐托盘为例解释一下,你就会更加明了:

 

作为堆栈如何工作的一个例子,可以把它看成一个弹簧加载托盘分发器,这种类型经常在自助餐厅中发现。每个托盘上都刻有数字。托盘依次从顶部装入,每个托盘都放置在已经装入的托盘上,弹簧进行压缩,以便在必要时为更多托盘留出空间。例如,在图中,托盘编号为42、23、2、9,先装载42个托盘,后装载9个托盘。

 

计算机世界里的“堆栈”你真的懂吗?

 

最后一个托盘是9号。因此,“第一个出来”的盘子也是9号。当顾客从托盘堆的顶部取出托盘时,第一个托盘是9号,第二个托盘是2号。然后更多的托盘被添加。这些托盘将不得不在我们装载第一个托盘之前从堆栈上下来。在托盘堆的任意顺序的push和pop出之后,托盘42仍然在底部。只有在42号托盘从堆栈顶部弹出后,堆栈才会再次清空。

 

而堆栈通常被放置在机器的最上面的地址区域。它们通常从最高的内存位置增长到较低的内存位置,允许在程序内存末端和堆栈“顶部”之间的内存使用中获得最大的灵活性。在我们的讨论中,堆栈在内存中是“向上”增长还是“向下”增长基本上是不相关的。堆栈的“top”元素是最后被推入并将首先被弹出的元素。堆栈的“底部”元素在删除时将使堆栈为空。

 

二者区别

 

堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。它由程序员分配和回收。

 

栈就是一个桶,后放进去的先拿出来,它下面本来有的东西要等它出来之后才能出来。(后进先出)由系统自动分配和回收。

 

堆栈缓存方式

 

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

 

堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。

 

栈:在windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。意思是栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。

 

堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。

 

作为“堆”的数据空间,必须是灵活的,因为成千上万的程序员在写什么程序是未知的。但可知道的一点,就是他们是跑在确定的某个OS里面的。因此,也不过就是给系统管理的数据空间起了个名字,叫栈;给程序员使用的空间,起了个名,叫堆。



Tags:堆栈   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
如果你学过数据结构,就一定会遇到“堆”,"栈","堆栈",这些对于小白来说有些头大,下面就来科普一下何谓堆栈? 按照WIKI的定义: 堆栈(英语:stack),是计算机科学中一种特殊的串列形式的...【详细内容】
2020-09-10  Tags: 堆栈  点击:(129)  评论:(0)  加入收藏
接口在线上服务器出现异常的时候,我们第一时间就是去服务器看下log,检查log是否有异常堆栈信息,如果有异常堆栈信息的话,再结合api的access log,是非常容易找出问题所在的,所以我...【详细内容】
2020-05-07  Tags: 堆栈  点击:(60)  评论:(0)  加入收藏
异常堆栈丢失今天登陆服务器进行例行的检查,发现异常日志文件里有很多nullPointException,只有简单的异常名称,却没有堆栈信息。没有异常堆栈,无法定位错误,也就不能修改了。到...【详细内容】
2020-04-18  Tags: 堆栈  点击:(47)  评论:(0)  加入收藏
上一篇咱们聊完了数据结构中最基础的「 数组 」和「 链表 」,今天咱们再来继续看看「 堆栈 」吧,我写技术文章很少 show code,所以经常有人吐槽。好吧,这个算法系列的文章我打...【详细内容】
2019-09-17  Tags: 堆栈  点击:(131)  评论:(0)  加入收藏
▌简易百科推荐
摘 要 (OF作品展示)OF之前介绍了用python实现数据可视化、数据分析及一些小项目,但基本都是后端的知识。想要做一个好看的可视化大屏,我们还要学一些前端的知识(vue),网上有很多比...【详细内容】
2021-12-27  项目与数据管理    Tags:Vue   点击:(1)  评论:(0)  加入收藏
程序是如何被执行的  程序是如何被执行的?许多开发者可能也没法回答这个问题,大多数人更注重的是如何编写程序,却不会太注意编写好的程序是如何被运行,这并不是一个好...【详细内容】
2021-12-23  IT学习日记    Tags:程序   点击:(9)  评论:(0)  加入收藏
阅读收获✔️1. 了解单点登录实现原理✔️2. 掌握快速使用xxl-sso接入单点登录功能一、早期的多系统登录解决方案 单系统登录解决方案的核心是cookie,cookie携带会话id在浏览器...【详细内容】
2021-12-23  程序yuan    Tags:单点登录(   点击:(8)  评论:(0)  加入收藏
下载Eclipse RCP IDE如果你电脑上还没有安装Eclipse,那么请到这里下载对应版本的软件进行安装。具体的安装步骤就不在这赘述了。创建第一个标准Eclipse RCP应用(总共分为六步)1...【详细内容】
2021-12-22  阿福ChrisYuan    Tags:RCP应用   点击:(7)  评论:(0)  加入收藏
今天想简单聊一聊 Token 的 Value Capture,就是币的价值问题。首先说明啊,这个话题包含的内容非常之光,Token 的经济学设计也可以包含诸多问题,所以几乎不可能把这个问题说的清...【详细内容】
2021-12-21  唐少华TSH    Tags:Token   点击:(9)  评论:(0)  加入收藏
实现效果:假如有10条数据,分组展示,默认在当前页面展示4个,点击换一批,从第5个开始继续展示,到最后一组,再重新返回到第一组 data() { return { qList: [], //处理后...【详细内容】
2021-12-17  Mason程    Tags:VUE   点击:(14)  评论:(0)  加入收藏
什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么时候来进行性能调优?(who) 怎么样进行性能调优?(How) 硬件配...【详细内容】
2021-12-16  软件测试小p    Tags:性能调优   点击:(19)  评论:(0)  加入收藏
Tasker 是一款适用于 Android 设备的高级自动化应用,它可以通过脚本让重复性的操作自动运行,提高效率。 不知道从哪里听说的抖音 app 会导致 OLED 屏幕烧屏。于是就现学现卖,自...【详细内容】
2021-12-15  ITBang    Tags:抖音防烧屏   点击:(23)  评论:(0)  加入收藏
11 月 23 日,Rust Moderation Team(审核团队)在 GitHub 上发布了辞职公告,即刻生效。根据公告,审核团队集体辞职是为了抗议 Rust 核心团队(Core team)在执行社区行为准则和标准上...【详细内容】
2021-12-15  InfoQ    Tags:Rust   点击:(24)  评论:(0)  加入收藏
一个项目的大部分API,测试用例在参数和参数值等信息会有很多相似的地方。我们可以复制API,复制用例来快速生成,然后做细微调整既可以满足我们的测试需求1.复制API:在菜单发布单...【详细内容】
2021-12-14  AutoMeter    Tags:AutoMeter   点击:(20)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条