历史上的今天
返回首页

历史上的今天

今天是:2024年09月09日(星期一)

正在发生

2020年09月09日 | 计算机世界里的“堆栈”你真的懂吗?

2020-09-09 来源:EEWORLD

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

 

按照WIKI的定义:

 

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

 

See the source image

 

这里的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个托盘。

 

[Figure 1.1]

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

 

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

 

二者区别

 

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

 

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

 

堆栈缓存方式

 

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

 

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

 

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

 

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

 

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

 

 


推荐阅读

史海拾趣

GETEDZ ( HVGT)公司的发展小趣事
电路设计要便于维护和检修,方便在设备出现故障时能够迅速定位并解决问题。
Gardner Denver公司的发展小趣事
电路设计要便于维护和检修,方便在设备出现故障时能够迅速定位并解决问题。
Federal Custom Cable公司的发展小趣事

Federal Custom Cable非常重视客户服务工作。他们建立了完善的客户服务体系,为客户提供从产品咨询、选型、定制到售后服务的全方位支持。同时,Federal Custom Cable还积极与合作伙伴建立长期稳定的合作关系,共同推动电缆行业的发展。这种以客户需求为导向、以合作伙伴关系为基础的经营模式,为Federal Custom Cable的持续发展提供了有力保障。

CCS[Custom Computer Services]公司的发展小趣事

在电子行业的早期,CCS公司凭借其出色的研发能力,成功开发出一款具有革命性的计算机服务软件。这款软件不仅大幅提高了计算机的运行效率,还为用户提供了更加便捷的操作体验。凭借这一技术创新,CCS公司迅速在市场中崭露头角,赢得了大量客户的青睐。随着技术的不断迭代和升级,CCS公司始终保持在行业前沿,逐渐发展成为电子行业的领军企业。

Bytes公司的发展小趣事

Bytes公司自成立以来,始终坚持以技术创新为核心竞争力。公司早期便投入大量研发资源,开发出一款具有划时代意义的电子产品,迅速在市场上占据一席之地。随着技术的不断进步,Bytes公司不断推出更新换代的产品,满足消费者日益增长的需求。同时,公司还积极与高校、科研机构合作,共同研发新技术,为公司的持续发展提供源源不断的动力。

Electronic-Bauteile Goerlitz GmbH公司的发展小趣事

为了进一步提升公司的竞争力,Electronic-Bauteile Goerlitz GmbH公司积极实施国际化战略。公司通过与国外知名企业的合作,引进先进的技术和管理经验;同时,公司还在海外设立了研发中心和生产基地,以便更好地满足当地市场的需求。这些举措使得公司的业务范围不断扩展,国际影响力不断增强。

问答坊 | AI 解惑

晒晒哥们自制的下载线

哥们自制的下载线,样子有些粗糙,但是经过验证了,很好用! [ 本帖最后由 西门 于 2009-5-11 22:14 编辑 ]…

查看全部问答>

智能循环水控制器设计!

基于 TMS320C2812DSP的智能循环水控制器的设计 江存胜 ,段建民 ,綦  慧 ,李大庆 ,倪少强  ( )北京工业大学 电控学院自动化系,北京 100022   摘要:  针对传统控制中自动化程度较低的问题 ,研制了智能工业循环水加药控制系统。该控制 ...…

查看全部问答>

让我们一起DIY个 FPGA开发板,上电路图,欢迎查错

自从让我们一起DIY个 FPGA开发板, 报名喽~~~ 之后 很久没给大家消息了,附件是电路图,protel99格式的, 之前只画过简单的,所以希望大家给予指教…… 一点相关资料:Altera Configuration Handbook & cyclone_device_handbook    & ...…

查看全部问答>

串口通信编程大全.pdf

详细介绍串口通信相关知识,想要的就下吧…

查看全部问答>

请问有没有这样的模拟软件?

        请问有没有这样的模拟软件?                 我刚学AVR单片机   用的是个学习板      感觉学习板功能很有限   我发现电路 ...…

查看全部问答>

想开发一款嵌入式导航软件,关于画图方面的疑问

现在我负责的模块是地图的绘制,就是说我封装一些函数,当别人需要绘制地图上的公路,铁路时,就调用我的函数就行。但是我现在一点头绪都没有,大牛们能不能给一些指导,谢谢。…

查看全部问答>

GPIO初始化配置成GPIO_Mode_Out_PP后怎么是低电平呢?

我用PB14以吸收电流的方式驱动一个LED灯,下面是初始化代码:GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;        //1GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  ...…

查看全部问答>

STM32F100C8/B价格是多少?

                                 STM32F100C8/B价格是多少? 量产了吗?…

查看全部问答>

关于时序分析中时钟的设置.

请教各位:当系统中有一个20MHz的输入时钟时,经过PLL倍频后,产生一100MHz和一20MHz的内部时钟时,Clock Setting那里如何设置,是不是应填最大的100MHz? PLL出来的100MHz和20MHz是不是相对于20MHz的输入时钟为衍生时钟?Individual Clocks是不 ...…

查看全部问答>

寻北京地区合作伙伴

本人要开发一些产品,想找有802.15.4和zigbee协议栈开发方面的软件高手合作,有意者请加QQ:2969574200详聊。…

查看全部问答>