【发布时间】: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% 这样的课程有效。我对它们进行了彻底的测试和调试,所以不要担心这种事情。
堆栈和队列的类型都是
<String>堆栈是我的 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