当前位置: 首页 > 网络应用技术

数据结构的原理 - 堆栈(堆栈),Java实现和后缀表达式的操作

时间:2023-03-08 14:18:36 网络应用技术

  该堆栈也是具有线性布置的数据结构,但是在这种结构中,我们只能访问最新数据。常见的示例是手枪,后来放入杂志的子弹将首先被击败。

  据说该定义被线性表的尾巴插入和删除。在这里,表的末端是指堆栈的顶部,而不是堆栈的底部。

  我们称一端允许插入和删除为顶部(顶部),另一端称为堆栈(底部),而不包含任何数据元素的堆栈称为空堆栈。堆栈也称为线性。最后一个表格,称为LIFO结构。

  堆栈的插头操作称为堆栈,也称为堆栈和堆栈;堆栈的删除操作称为堆栈,有些称为堆栈。

  由于堆栈本身是线性表,因此它也适用于堆栈的线性表和链存储的顺序。

  对于一系列要素,即使规定了进入堆栈的顺序,其出口的顺序不一定是压力顺序。

  例如,如果我们现在有3个整数数字元素1、2和3进入堆栈,那么堆栈的序列是什么?

  从这个简单的示例可以看出,只有三个元素具有五个可能的堆栈顺序。如果元素数量很大,则堆栈中的更改将更多。

  堆栈的顺序存储实际上是通过线性表面序列的顺序简化的。我们称为顺序堆栈。序列存储结构通常在数组中使用,并且堆栈也不例外。但是,有必要在此处考虑,阵列的哪个末端更好,作为堆栈的顶部和底部?

  当然,这是数组的起点,即0索引更好,因为堆栈的底部是堆栈的底部。随后的元素自然存储在堆栈的顺序中。它不需要移动元件的位置,并且堆栈的顶部自然是在最大元素索引处选择的,因此该元素的堆栈不需要其他元素的位置。堆栈的时间复杂性为O(1),这很快。

  堆栈空间结构使用Java的JVM在Runtime.java的递归调用时使用该方法来调用该方法,还取决于堆栈空间的实现。

  我们的JDK已经有一个堆栈实现类,即堆栈类,该类由数组实现。这里是一个更简单的实现。

  堆栈的链存储结构称为链堆。

  堆栈只是插入和删除操作的堆栈顶部。链接列表的头部或链接列表的尾巴的头部呢?当然,它放在链接列表的头上,因为链接列表通常只将指针保存在头上。如果将堆栈的顶部放在链接列表的末端,那么当堆栈并输入堆栈时,您需要从链接头的头开始到链接列表的尾部进行操作。。

  与顺序堆栈相比,对于链堆,除非没有内存的空间,否则基本上没有堆栈完整。

  该堆栈有一个非常重要的应用程序:即在编程语言中实现递归。例如,Java中的递归是通过堆栈实现的。

  方法定义了调用方法本身的现象,该现象称为递归。

  对于调用方法本身的方法,您可以将其理解为另一种方法,但是此方法与外观相同。

  注意:

  我们使用一个简单的示例来解释该方法如何堆栈实现递归调用方法。

  寻求多个步骤:

  因为堆栈的后退结构是第一个out,所以该方法还具有堆栈和堆栈。当调用方法时,该方法将进入堆栈。堆栈空间顶部的堆栈框架将不在堆栈中。

  在递归方法中,在输入第一层方法后,它是当前方法(堆栈顶部的方法,JVM仅通过当前方法执行,仅当前方法是有效的)。

  然后在执行方法中启动代码。当执行第二层的方法时,JVM将将调用方法放入堆栈中,该方法也将其按在堆栈的顶部,以成为“当前方法”。在同一时间,第一层方法不是结束,但其后续代码将暂时“放置”,直到返回内部呼叫方法为止。

  以同样的方式,当第二层方法调用时,将执行该方法中的第三层递归调用。方法的前几层被冷冻,因为内部呼叫未返回,而是继续致电其他呼叫。

  从上述步骤可以看出,该方法在调用时始终从外层中呼叫一层。

  那么,什么时候可以返回这种递归方法?

  我们注意到每个递归调用,方法参数n均以1减少,这是递归方法的关键,可以正常结束。当执行到第五层时,n参数将变为1。根据代码,n不大于1.执行其他逻辑,然后可以返回此递归并返回1。

  第五层方法由于返回而结束,这也导致第四层方法结束。第四层方法结束:

  返回2*(1)

  第四层方法由于返回而结束,这也导致第三层方法结束。第三层方法结束:

  返回3(21)

  第三层方法由于返回而结束,这也导致第二层方法结束。第二层方法结束:

  返回4*(3*(2*1))

  第二层方法由于返回而结束,这也导致第一层方法结束。第一层方法结束:

  返回5*(4*(3*(2*1))))

  我们看到最终回报的结果是返回第一个方法的结果,该结果是5级。

  从上述步骤可以看出,当您返回时,您始终从底部方法开始返回。

  查看步骤的步骤,我们知道递归使用的特征是堆栈的特征。在JVM中,指定堆栈顶部的方法称为当前方法,并且只能执行当前方法。对于Java中的更多递归案例,您可以阅读本文:Java递归和各种案例演示的原则。

  在递归呼叫阶段:在称为第二层方法之后,将第二层方法输入堆栈中,成为堆栈顶部的当前方法,然后继续将第三层方法调用到堆栈中...按下堆栈的底部:

  在方法返回阶段中:首先返回堆栈的最高方法,然后上一层方法返回堆栈的out,最终最终的最外面方法返回。这完成了调用方法的整个逻辑!

  *我们常见的标准四个操作,例如`1 + 2 3 +(4 5 + 6)7`,这种表达式称为中场表达式,因为其操作符号在数字之间。**

  对于我们的人类来说,这种表达非常简单易懂,但是对于计算机来说,计算机很难分析这样的表达式。简单的公式就像是一本用于计算机的天堂书。

  后来,在1950年代,波兰逻辑学家发明了一个没有括号的后缀表达式,也称为反波兰表达式。此后缀表示是一种新的表达方式,它巧妙地解决了四个操作以实现该程序的问题。

  对于中间表达式,后缀语句的使用应为:。类似的表达式称为后缀表达式,后缀的原因是所有符号都出现在数字的计算后面。表达式没有括号,对于人类来说看起来更麻烦,但是对于计算机来说非常简单。

  后缀表达式的计算规则是:从左到右表达式表达式的每个数字和符号。当您遇到数字时,您可以输入堆栈。当它是一个符号时,它将位于堆栈的堆栈顶部。结果,输入堆栈,直到最终获得结果为止。

  让我们计算上述后缀表达式:

  后缀表达式中的前三个是数字,因此1、2和3进入堆栈:

  下一步是“*”,因此堆栈中的3和2相互乘,结果将输入:

  下一步是“+”,因此添加了堆栈中的6和1堆栈,结果将添加:

  接下来的两个是数字,因此输入堆栈4和5:

  下一步是“*”,因此堆栈中的5和4个堆栈被乘以,结果将输入:

  接下来是数字,6个条目堆栈:

  下一步是“+”,因此添加了堆栈中的6和20堆栈,然后输入结果:

  接下来是数字,7个条目堆栈:

  下一步是“*”,因此堆栈中的7和26被乘以,结果将输入:

  最后一个是“+”,因此添加了堆栈中的162和7个堆栈,并添加了结果:

  最后,在堆栈189中,王位后缀表达的计算结果。该结果与培养基表达的计算结果完全相同。

  后缀表达式的中间 - 屏幕表达式:从左到右表达式中表达式的每个数字和符号,如果数字输出,则将成为后缀表达式的一部分;优先级是正确的括号或优先级不是高于顶部符号(乘以优先级添加和减法),然后堆栈的顶部元素不在堆栈和输出中,并且将当前符号输入到堆栈中,直到最终输出后缀表达式为止。

  让我们来看看

  初始化一个空堆栈以使用符号进出堆栈:

  第一个字符是数字1,输出,第二个字符是符号“+”,输入堆栈:

  第三个字符是数字2,输出,第四个字符是符号“*”,优先级高于堆栈的+顶部,输入堆栈:

  第五个字符是数字3,输出,第六个字符是符号“+”,它低于堆栈的顶部。+'

  第七个字符是符号“(”,左支架,输入堆栈:

  第八个字符是数字4,输出,第九个字符是符号“”,输入堆栈。这次,后缀表达式为:`1 2 3 + 4`

  第10个字符是数字5,输出,第11个字符是符号“+”,优先级小于堆栈的顶部,堆栈的顶部元素不在堆栈中,直到匹配为止(因此,到目前为止,但是括号不会从堆栈中伸出, +输入堆栈中,进入堆栈,输入堆栈。

  第12个字符是数字6,输出,第13个字符是符号“)”,即正确的括号。公式为:

  第16个字符是符号“*”。优先级高于堆栈的顶部符号。第17个字符是数字7,输出:

  由于所有字符分析均已完成,因此堆栈中的其余符号不在堆栈和输出中。最终的后缀表达式是:与先前的后缀表达式相处。

  如果您希望一台计算机能够处理我们通常的标准(媒介)表达式,那么最重要的是两个步骤:

  整个过程都充分利用堆栈的向后特性来处理它。据了解,它还了解堆栈的数据结构。

  这次,我们介绍了堆栈数据结构的基本概念,并介绍了实现Java堆栈的两种不同方法,并最终介绍了堆栈的应用,包括递归调用和四个表达式操作。

  该方法的递归调用可能需要一定数量的JVM。如果您对Java的JVM的堆栈结构不太了解,则可以看到此博客:Java的JVM Runtime stack结构和方法调用说明。如果您不熟悉线性表的基本概念,则可以阅读此博客:Java中线性表数据结构和实施案例的详细说明。

  作者:Liu Java