您现在的位置是:亿华云 > IT科技

深入研究“栈”,你学会了吗?

亿华云2025-10-08 23:12:22【IT科技】7人已围观

简介1.栈是什么在计算机软件开发过程中,我们经常听到,看到,用到“栈”。那么到底“栈”是什么呢?“栈”的作用是什么呢?不妨我们先看一下《新华字典》是如何定义的。栈基本含义是储存货物或供旅客住宿的房屋,如货

1.栈是栈什么

在计算机软件开发过程中,我们经常听到,深入看到,研究用到“栈”。栈那么到底“栈”是深入什么呢?“栈”的作用是什么呢?

不妨我们先看一下《新华字典》是如何定义的。

栈基本含义是研究储存货物或供旅客住宿的房屋,如货栈,栈客栈。深入

说到客栈又让我联想到一部著名的研究武侠电影“新龙门客栈”,客栈就是栈提供给各位大侠一个临时居住的房间。

既然客栈也是深入“栈”,说明栈的研究底层的含义一样,都是栈用来做存储的。在计算机中“栈”是深入数据存储空间中的一个区域,用于储存特定的研究数据。亿华云计算

栈的承载实体通常是随机存取存储器(RAM),CPU可以直接与RAM交换数据,RAM在工作状态下,可以随时从任何一个指定的地址写入(存入)或读出(取出)信息。

综上所述,在计算机中“栈”就是存储数据的一个存储区域。通常说的“堆栈”和“栈”,这两者意义相同。

2.栈的分类

我们知道栈就是用来存储数据的,在实际使用中栈并不是只有唯一的一种形式,而是分为多种类型,接下来我们了解一下栈的分类。

根据栈在存储器中的增长方向,可以把栈分为递减栈和递增栈 :

递减栈(Descend) :向栈写入数据时,栈的生长方向是高地址到低地址。

递增栈(Increase) :向栈写入数据时,栈的香港云服务器生长方向是低地址到高地址。

根据栈指针SP指向的位置,可以把栈分为满堆栈和空堆栈:

满堆栈(Full Stack):SP指针始终指向栈顶元素,向栈写入数据时先移动SP指针,再将数据放入SP指向的地址。

空堆栈(Empty Stack):SP指针始终指向下一个将要放入元素的位置,向栈写入数据时先将数据放入SP指向的地址,再移动SP指针。

根据栈的增长方向和栈指针的位置,栈可以分为以下4种基本类型:

满增栈(FA):栈指针指向最后压入的数据,栈的生长方向是低地址向高地址。满减栈(FD):栈指针指向最后压入的数据,栈的生长方向是高地址向低地址。空增栈(EA):栈指针指向下一个将要压入数据的地址,栈的生长方向是低地址向高地址生长。空减栈(ED):栈指针指向下一个将要压入数据的地址,网站模板栈的生长方向是高地址向低地址生长。

其中满减栈是使用得最多的一种栈类型。

3.栈的操作

计算机的结构框图如下:

由图可知在处理器中直接参入运算的是寄存器堆中的寄存器,逻辑运算的结果可以输出到数据存储器的地址端口和寄存器堆的数据端口。

寄存器堆中的寄存器值可以输出到数据存储器的数据端口,实现暂存寄存器的值。

栈操作就是将寄存器的值存入数据存储器,或是将数据存储器中的数据回读到寄存器中。

重要的事情说三遍:

栈就是用来暂存处理器中寄存器的值!栈就是用来暂存处理器中寄存器的值!栈就是用来暂存处理器中寄存器的值!

ARM构架处理器中的寄存器组如下:

栈操作的两个指令:入栈PUSH和出栈POP。

对于PUSH操作,处理器先减小SP值,然后将指定寄存器存储到SP寄存器指向的存储器地址。

对于POP操作,处理器先将SP指向的存储器地址存储到指定寄存器中,然后将SP寄存器值增加。

栈的操作具有“先进后出”的特性,先存入栈的数据,在栈的底部,后存入栈的数据在顶部,栈中的数据只能从栈顶部读出,因此就有了“先进后出”。

以满减栈为例,下图展示了连续两次PUSH操作,SP寄存器和数据存储器中的数据变化。

PUSH操作时处理器先减小SP值,然后将指定寄存器存储到SP寄存器指向的存储器地址。

注意:执行PUSH操作后数据存储器中(栈空间)的数据发生变化,但是指定寄存器的值还是原有的值(不会被清零)。

以满减栈为例,下图展示了连续两次POP操作,SP寄存器和指定寄存器的数据变化。

POP操作时处理器先将SP指向的存储器地址存储到指定寄存器中,然后将SP寄存器值增加。

注意:执行POP操作后指定寄存器的数据发生变化,但是数据存储器中(栈空间)的数值还是原有的值(不会被清零)。

PUSH操作后由于指定的寄存器的数据被保存,因此此后可以将该寄存器用于其它用途,当该寄存器完成其它操作后可以通过POP操作恢复原先数值。

由于在处理器中只有寄存器能直接参入运算,通常情况下寄存器的数量有限(通常为16个或者32个),栈操作相当于将寄存器的数量进行扩展。这种操作类似火影忍者中鸣人的影分身(一个真身多个假身)。

总结栈操作:

栈是一个数据存储空间(栈空间)。栈有一个栈指针,指向当前栈地址。每次执行PUSH操作后栈空间的数据发生变化,每次执行POP操作后指定寄存器的数据发生变化。每次PUSH和POP操作后SP栈指针都会自动调整(无需用户介入)。

4.栈的作用

上文描述了栈空间本质上暂存处理器中寄存器的运算结果,具体来说栈用于如下4情况的数据存储:

1、用于保存函数执行前的寄存器的值,以便函数结束时恢复。

2、用于存储局部变量。

3、用于传递函数调用时的参数。

4、用于存储中断产生时的状态寄存器和通用寄存器的数值。

4.1函数调用前保存寄存器值

当被调用的函数需要使用寄存器进行数据处理时,需要使用栈临时保存寄存器的数值,当函数结束时恢复寄存器的数值。

测试代码如下:

/

很赞哦!(1995)