什么是堆栈/堆栈指针:类型及其应用

堆栈只不过是线性的数据结构,插入和删除只发生在一端。插入操作有一个称为PUSH的特殊名称,删除操作也有一个称为POP的特殊名称。PUSH和POP是两个只能在特定堆栈中执行的基本操作。它是一组存储器位置,这些存储器位置与读存储器或写存储器有关。这是用来在程序执行期间存储二进制信息的,当我们执行任何程序时,程序的内容都会存储在堆栈中。它遵循后进先出(LIFO),它只用于存储和检索数据,而不用于存储数据。栈/栈指针的简要说明将在下面讨论。


什么是堆栈/堆栈指针?

定义:栈是一种存储设备,用于以后进先出的方式存储信息或数据。当我们以LIFO方式输入数据时,必须首先删除的元素是最后一个插入元素,因此最后插入的元素首先被取出。它是地址寄存器中称为堆栈指针(SP)的内存单元。堆栈指针总是指示堆栈中的顶部元素,这意味着数据必须插入到哪个位置。

类型的栈

有两种类型的堆栈它们是寄存器堆栈和内存堆栈。

寄存器堆栈

寄存器堆栈也是存在于内存单元中的存储设备,但它只处理少量的数据。在寄存器堆栈中,堆栈深度总是有限的,因为寄存器堆栈的大小与内存相比非常小。

在寄存器堆栈中的推操作

步骤1:堆栈指针加1。

SP←SP + 1

步骤2:将数据输入堆栈。

PCBWay

M (SP)←博士

DR的数据寄存器在哪里

步骤3:检查栈是否已满


If (sp=0) then (full←1)

目的:马克非空

空←0

在寄存器堆栈中弹出操作

步骤1:从堆栈中读取数据。

←M (SP)博士

步骤2:减量堆栈。

SP←SP 1

步骤3:检查堆栈是否为空

如果sp=0,则空←1

64位寄存器堆栈的堆栈组织如下图所示。

寄存器堆栈组织
寄存器堆栈组织

内存堆栈

在内存堆栈中,堆栈深度是灵活的。它占用大量的内存数据,而在寄存器堆栈中只有有限数量的内存单词将被存储。

内存栈中的推操作

步骤1:SP←SP + 1

步骤2:M (SP)←博士

弹出操作在内存堆栈

步骤1:←M (SP)博士

步骤2:SP←SP 1

与寄存器单元相比,存储器单元存储大量的数据。内存栈图如下图所示。

内存堆栈
内存堆栈

整个内存单元分为三部分,第一部分是程序(只有指令),第二部分是数据(操作数),第三部分是堆栈。程序指令总是存储在程序计数器(PC)中,数据寄存器由地址寄存器(AR)标识。地址3000到4001用于堆栈和第一项或元素存储在4001。

8085微处理器的堆栈/堆栈指针

8085的程序员视图微处理器包含通用寄存器和专用寄存器.通用寄存器有A、B、C、D、E、H、L,专用寄存器有SP(堆栈指针)和PC(程序计数器)。8085微处理器的编程视图如下图所示。

8085的程序员视图
8085的程序员视图

栈指针是一个包含内存地址的16位寄存器,假设栈指针(SP)内容为FC78H,则微处理器8085对其进行解释。内存位置具有从FC78H到FFFH的有用信息,而从FC77H到0000H的内存位置没有有用信息。栈指针的解释如下图所示。

栈指针的解释
栈指针的解释

栈/栈指针的基本操作

栈有两种操作:PUSH操作和POP操作。

推动操作

PUSH表示将一个元素推入或插入到堆栈中。PUSH操作总是使堆栈指针增1,POP操作总是使堆栈指针减1。在push操作的情况下,我们必须检查是否有空闲空间可用。如果空闲空间可用,我们可以执行推操作,如果空闲空间不可用,则会出现溢出的错误消息。分别进行推操作时检查溢出。push和pop的基本操作如下图所示。

PUSH和POP的基本操作
PUSH和POP的基本操作

图(a)是堆栈。如果你想把元素推入堆栈,你必须推(s, a),其中' s '就是一个堆栈。在堆栈中,我们放置a元素,这个操作如图(b)所示。如图(3)所示,假设堆栈包含三个元素a, b,c,并且堆栈中填充了一个元素。

如果您想使用push(s, d)插入第四个元素' d ',但是没有可用的空间来插入元素,那么这表明堆栈溢出。当栈满时使用溢出术语,push操作的算法如下所示。

Push (stack[], top, Max stack, item)

如果(顶部= = maxstack-1)

打印“溢出”

其他的

=最高+ 1

堆栈[上]=项目

结束

流行的操作

POP意味着删除堆栈顶部的元素。在弹出操作的情况下,我们必须检查堆栈最初是否为空。如果堆栈最初是空的,那么就会发生下溢情况。假设堆栈是空的,但你仍然想将元素弹出堆栈,但堆栈中没有元素,那么就会导致堆栈下流。

在弹出操作时分别检查底流。在弹出操作中,无论堆栈中出现了什么顶部的元素,都应该弹出或删除,所以不需要提到哪个元素将弹出,默认情况下,最顶部的元素将弹出。弹出操作的算法如下图所示。

流行(stack[]、顶部、项目)

如果(顶部= = 1)

打印“下溢”

其他的

项=堆栈(顶部)

顶级= (

例子

元素按A、B、C、D、E的顺序插入,它表示5个元素的堆栈。在图(a)中,我们希望将' a '元素推入堆栈,然后top变为0 (top=0),类似地,当' B '元素被推入时top=1,当' C '元素被推入时top=2,当' D '元素被推入时top=3,当' E '元素被推入时top=4。

所以不管我取了什么元素放到堆栈中,堆栈就满了。如果你想推入另一个元素,在堆栈中没有位置,所以它指示溢出。现在堆栈已经满了,如果你想弹出元素' E '必须先删除元素。推操作如下图所示。

推动操作
推动操作

我们必须使用pop操作来删除堆栈中的元素。所以只要提到pop()不要在pop中写参数,因为默认情况下它会删除顶部元素。第一个“E”元素被删除,然后是“D”元素.....“一个”。当顶部的元素被删除时,顶部的值就会减少。当top=-1堆叠表示下溢。弹出操作如下图所示。

流行的操作
流行的操作

这就是如何使用push和pop操作在堆栈中插入和删除元素的解释。

应用程序

栈/栈指针的应用是

  • 字符串反转
  • 平衡的括号
  • 撤销/电道
  • 用于激活记录的系统堆栈
  • 中缀,前缀,后缀,表达式

常见问题

手臂中的堆栈指针是什么?

栈指针寄存器(R13)在ARM中用作指向活动栈的指针。

为什么堆栈指针是16位的?

堆栈指针(stack pointer, SP)和程序计数器(program counter, PC)用于存储之前的位置,内存位置地址为16位,因此堆栈指针(stack pointer, SP)也是16位。

栈指针的作用是什么?

堆栈指针(SP)的作用是指示堆栈中元素的顶部。

4) 8085使用哪个堆栈?

在8085中使用的堆栈是后进先出(LIFO)。

栈指针是寄存器吗?

是的,堆栈指针(SP)是一个地址寄存器,它总是指示堆栈中元素的顶部。

在这篇文章中什么是栈/堆栈指针(SP), push操作,pop操作的一个例子,寄存器堆栈和内存堆栈与图表,堆栈,堆栈和堆栈指针的8085和应用程序的讨论。这里有个问题,堆栈/堆栈指针有什么用?

2的评论

  1. Dharmik Dankhara 说:

    堆栈指针在CPU中的角色。

    1. 塔伦阿加瓦尔 说:

      嗨Dharmik
      当执行PUSH和POP操作时,堆栈指针会自动调整,以避免下一个堆栈操作破坏先前堆叠的数据。

添加评论