当前位置: 首页 > 知识库问答 >
问题:

使用堆栈理解Java代码中的后缀表达式计算

璩慎之
2023-03-14

我得到了一段代码来破译、解释和提供任何改进建议。我被告知它可以工作,我们不能运行代码来测试它。我很理解它,但只需要有人来运行它,以确保我所理解的是正确的,请获得任何帮助来解释我不理解的地方。我已经做了大量的研究,仍然有一些问题。

代码正在实现用于读取只使用乘法和加法的后缀表达式。然后计算表达式,同时将结果保存到堆栈中。然后打印出结果。操作数被推到堆栈上,然后当它读取运算符时,它从堆栈中弹出前2个操作数,执行计算并将结果存储回堆栈。

程序假定整数和运算符是由某种字符分隔的,比如空格之类的,但根本不检查输入的合法性。

 public static void main(String[] args)
{
    char[] a = args[0].toCharArray();
    int N =a.length;
    intStack s = new intStack();
    for (int i = 0; i<N; i++)
    {
        if (a[i]=='+')
        {
            s.push(s.pop() + s.pop());
        }
        if (a[i]=='*')
        {
            s.push(s.pop() * s.pop());
        }
        if ((a[i] >= '0') && (a[i] <= '9'))
        {
            s.push(0);
        }
        while ((a[i] >= '0') && (a[i] <= '9'))
        {
            s.push(10*s.pop() + (a[i++]-'0'));
        }
        Out.println(s.pop() + "");
    }
}

Post fix表达式示例:2 3 5+*=16

当谈到last if语句和while循环时,我很困惑。

因此,当它第一次推入一个0-9数字字符时,它将存储一个#0,然后弹出那个0,乘以10并将其添加到下一个数字字符(如果有的话),然后将结果推回到堆栈中?如果是,为什么将0推到堆栈上?

它不应该将第一个0-9号字符转换为int数据类型,将其推到堆栈上,然后转到while循环吗?

然后在While循环中,读取数组,并继续将0-9个编号字符转换为int数据类型,并将它们推送到堆栈中,直到读取到不同的字符?

我也看不出它是在while循环中递增int I还是跳出while循环前进到下一个字符?

共有1个答案

寇桐
2023-03-14

零的初始推送有点让人迷惑。理解其中发生的事情的关键是注意i没有递增。例如,当代码看到'4',这是“42”中的第一个数字时,if语句将推零;然后循环立即弹出它,乘以10,加上4,然后向后推。i前进到下一个字符(即2),然后循环弹出4,乘以10,加上2,并存储回42-所需的结果。

代码中有一个错误:当表达式以数字结尾时,您将得到一个索引越界异常。例如,42是一个有效的后缀表达式(没有运算符是可以的,对吗?)内部循环将前进到字符串的末尾,从而导致异常。

 类似资料:
  • 我正在为我的一堂计算机科学课开发一个计算后缀表达式结果的程序。该程序使用堆栈ADT来实现这一点。 我已经编写了程序,但相信可能会有错误,因为一些表达式的结果不正确。我不确定我的错误在哪里。 此外,当输入文件为空时,程序将生成一个值32767。那是从哪里来的? 表达式:34+3*值=21。 主程序:

  • 我的讲师给了我一个任务,让我创建一个程序,使用堆栈将表达式和中缀转换为后缀。我制作了堆栈类和一些函数来读取中缀表达式。 但是这个函数,叫做,它负责使用堆栈将数组inFix中的inFix表达式转换为数组postFix中的postfix表达式,并没有做它应该做的事情...你们能帮帮我告诉我哪里做错了吗? 下面是从中缀转换为后缀的函数的代码,是我需要帮助修复的代码: 注意:convertToPostfi

  • 我的任务是使用单链表实现堆栈,将中缀形式的字符串转换为后缀形式。为简单起见,此字符串不包含任何空格。 简而言之,我的算法是: > 按操作顺序使用字符及其关联优先级创建临时节点 如果是操作而不是数字,则将其推到堆栈上/如果是数字,则自动将其附加到后缀字符串 每次将一个字符推送到堆栈上时,如果堆栈的顶部节点的优先级高于下一个字符的临时节点,请将其从堆栈中弹出,并将其附加到后缀字符串中。 这些步骤在手动

  • 这是一个理论上的问题: 我必须计算一个表达式,我已经从中缀转换到后缀。后缀保存在中,因为我希望避免使用。这样我就知道数字之间的除法在哪里,我可以按“正确”的顺序访问它。 它看起来是这样的: 现在我想用两个堆栈: null 如果我到达一个运算符,并且数量计数至少为2,我将执行该操作并将其推到目标堆栈上。到达原始堆栈的末尾(现在是空的),我会把所有的东西都传递给它,然后从头开始,直到只剩下结果。 我现

  • 我的讲师给了我一个任务,创建一个程序,使用堆栈将中缀表达式转换为后缀。我制作了堆栈类和一些函数来读取中缀表达式。 但是这个名为inToPos(charstring[])的函数正在创建断点,该函数负责使用堆栈将字符串中缀中的中缀表达式转换为字符串后缀中的后缀表达式。你们能帮帮我,告诉我我做错了什么吗? 这些是我的代码,非常需要您的帮助:) 注:inToPos功能是使用以下算法实现的: 从左到右扫描中

  • 我正在编写一个程序,要求用户输入后缀表达式,然后将结果输出到表达式。我正试图使用一个单链表来实现这一点,并使用适配器模式来创建一个堆栈。 类、类和实现的代码都是直接从我自己的数据结构书中获得的。因此,类是唯一一个包含我自己的代码(并且有错误)的类。 我以前写过一个程序,它只使用堆栈计算后缀表达式,但这次我对包含的额外类感到困惑。 我肯定我有很多错误,但对我来说最明显的错误是在我的类中,每次我将一个