【问题标题】:Cannot understand what I need to check for in the condition of a while loop in Java无法理解在 Java 中的 while 循环条件下我需要检查什么
【发布时间】:2015-06-21 09:40:32
【问题描述】:

我无法理解在以下 while 循环的条件评估中需要检查的内容,这是算法伪代码的摘录:

 if the token is an operator {
        while(the stack is not empty 
            AND the top of the stack is not a "(" 
            AND the precedence of the token on the top of the stack >= current token) {
                    pop the token on the stack and enqueue it
            } // end while
        push current token onto the stack
        } // end if token is an operator

我的方法是这样的,知道我正在检查一个运算符(即 + - ^ 等):

while((stack.isEmpty()) == false && (((Comparable<String>)stack.peek()).compareTo( "(") != 0) && ) //Missing a logical && (CHECK ALGORITHM)
    queue.enqueue(stack.pop());
    stack.push(tokenIterator);
}

一些说明:

  • 我编写了自己的 Stack 和 Queue 类,包括它们的功能和方法。这是任务的一部分。我无法使用默认的 Java Stack 和 Queue 结构(正如我所说,创建我们自己的并复制它们的功能是任务的一部分)。我是 200% 这样的课程有效。我对它们进行了彻底的测试和调试,所以不要担心这种事情。

  • 堆栈和队列的类型都是&lt;String&gt;

  • 堆栈是我的 Stack 类的一个实例,它调用 isEmpty() 并返回一个布尔值(如果为空则为 true,否则为 false)。

  • stack.peek() 调用返回一个对象,在本例中是堆栈顶部的字符串。

  • 整个算法的应用是对一个中缀形式的数学表达式的输入进行处理,并将其转换为后缀形式。

  • 主要问题:我缺少最后一点伪代码。具体来说,该行: “AND 栈顶令牌的优先级 >= 当前令牌”。我不明白它要求我检查什么,因此我没有对其进行编码(如您所见,我上面的 java 代码缺少最后一个 && 之后的代码)。我最好的猜测是它要求我检查堆栈顶部下方的令牌(也就是顶部之前的元素)是否 >= 比当前令牌 必须是运算符(否则,我们不会输入上面的 if 语句)。我不知道如何将运算符与数字进行比较,并得到不会崩溃的合理值。

示例:我编写了一个帮助函数,它以一种很好的形式打印当前队列内容。如果我输入表达式(6 + 9) - (9 + 6 + 3) + 2,队列会打印:

 ADD->|| 6| 9 | + | 9 | 6 | + | 3 | + | 2 | + | - ||<-RMV

这当然是上述中缀表达式的错误后缀表示法。按照我的说法,应该是:6 9 + 9 6 + 3 + - 2 +

您实际上不需要知道更多,因为我的问题仅仅是“堆栈顶部令牌的优先级> = 当前令牌”是什么意思。我无法理解它要我做什么。希望在我的 while 循环中解决第三个 && (and) 条件将使我的算法输出正确的后缀符号。


编辑 1:

现在我知道什么是优先级,我认为我队列中的( 可能在检查优先级方面发挥重要作用,因此,这里是作为示例给出的相同数学表达式的队列的原始输出上面(我从上面另一个队列打印中的队列中删除了(,因为我认为它们没用):

#######QUEUE#######
======================================================================
ADD->|| 6| 9 | + | 9 | 6 | + | 3 | + | 2 | + | ( | - | ( ||<-RMV
======================================================================

【问题讨论】:

  • 我认为是关于运算符优先级:* > + 等。如果使用括号来确定运算符的优先级,则根本不需要这个条件。
  • 我想我需要它。我在编辑 1 中更新了我的队列输出(请参阅上面的内容)。您认为我可以使用队列中的( 提出解决方案吗?
  • 正如@Paul 评论的那样,您尝试使用 alphabetical 比较来比较运算符(正如String#compareTo 所做的那样)。您需要按含义进行比较。

标签: java algorithm stack queue postfix-notation


【解决方案1】:

记号的优先级是计算函数时的优先级。例如:最常见的数学运算符的优先级降序排列:() ^ */% +-.

您提到的条件阻止算法在队列中包含优先级高于当前运算符的任何运算符。

【讨论】:

  • 是否有内置的 Java 来检查优先级?如果没有,我想我可以编写一个辅助函数来检查它。我认为我的优先顺序如下:^ * / + - 与您在答案中发布的内容相匹配。
  • 另一个问题,如果我比较说,(Comparable)token).compareTo("*"),其中 token = *,这会返回 0 吗?
  • 请参考我上面的编辑1。既然我已将输出的( 包含在队列中,您认为它会以某种方式帮助我获得正确的答案吗?提前致谢
  • 内置优先级检查:实现该检查应该不会太难,只需将运算符(作为字符串)映射到一些表示其优先级的常量。比较:它将返回 0(尽管空格可能会改变结果!!!) - 强制转换是不必要的,因为 String 实现了 Comparable&lt;String&gt;(:把这些作为最高优先级的算子处理,否则结果会不正确。
  • 我创建了一个函数,它将给定的运算符映射到一个从 6 到 0 的值,6 为“(”,5 为“*”等等,默认为 0,即一个数字,它起作用了!这样我可以将它们返回的值与另一个值进行比较 (>=) 非常感谢您的帮助!!!!!
【解决方案2】:

由于当前标记必须是运算符,我认为这里的“优先级”指的是运算符优先级,因此意味着乘法和除法优先于加法和减法。这有意义还是你只是加减法?

【讨论】:

  • 这是有道理的。我得到了保罗在他的回答中发布的优先级,所以它包括 ^ * / + -。请参考我的编辑1
猜你喜欢
  • 2021-03-21
  • 1970-01-01
  • 2017-04-03
  • 2015-05-03
  • 1970-01-01
  • 2014-06-03
  • 1970-01-01
  • 2023-03-17
  • 2012-09-14
相关资源
最近更新 更多