在Java中的while循环条件下无法理解我需要检查的内容

时间:2015-04-15 12:19:49

标签: java algorithm stack queue postfix-notation

我无法理解在以下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%这样的课程工作。我对它们进行了彻底的测试和调试,所以不要担心这样的事情。

  • 堆栈和队列的类型都为<String>

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

  • stack.peek()调用返回一个Object,在这个例子中是Object顶部的String。

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

  • 主要问题:我错过了最后一点伪代码。具体来说,这条线: &#34; 和堆栈顶部令牌的优先级&gt; =当前令牌&#34;。我不明白它要求我检查什么,因此我没有编码(正如你所看到的,我上面的java代码在最后一个&amp;&amp;之后缺少代码)。我最好的猜测是,它要求我检查堆栈顶部下方的令牌(也就是顶部之前的元素)是否>当前令牌,必须运算符(否则,我们不会进入上面的if语句)。我不知道如何比较一个操作员和一个数字,并得到一些不会崩溃的合理的东西。

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

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

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

你真的不需要知道更多,因为我的问题仅仅是&#34; 以及堆栈顶部令牌的优先级&gt; =当前令牌&#34;意思。我无法理解它要求我做什么。希望解决这第三个&amp;&amp;我的while循环中的()条件将使我的算法输出正确的后缀表示法。


编辑1:

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

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

由于当前令牌必须是运营商,我在想什么&#34;优先级&#34;这里指的是运算符优先级,因此意味着乘法和除法优先于加法和减法。这有意义还是你只是加减?