无法理解我需要在 Java 中的 while 循环条件下检查什么
Cannot understand what I need to check for in the condition of a while loop in Java
我无法理解我需要在以下 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 classes 并包括它们的功能和方法。这是任务的一部分。我无法使用默认的 Java 堆栈和队列结构(正如我所说,创建我们自己的并复制它们的功能是任务的一部分)。我 200% 这样 class 可以工作。我对它们进行了彻底的测试和调试,所以不用担心这种事情。
栈和队列都是<String>
类型
堆栈是我的堆栈 class 的一个实例,它调用 isEmpty()
和 returns 一个布尔值(如果为空则为真,否则为假)。
stack.peek()
调用 returns 对象,在本例中是堆栈顶部的字符串。
整个算法的应用是将一个中缀形式的数学表达式的输入进行处理,并将其转化为后缀形式。
主要问题:我遗漏了最后一点伪代码。具体来说,该行:
“AND 堆栈顶部令牌的优先级 >= 当前令牌”。我不明白它要求我检查什么,因此我没有对其进行编码(如您所见,我上面的 java 代码缺少最后一个 && 之后的代码)。我最好的猜测是,它要求我检查堆栈顶部下方的标记(也就是顶部之前的元素)是否 >= 当前标记, 必须是 一个运算符(否则,我们就不会进入上面的 if 语句)。我不知道如何将一个运算符与一个数字进行比较,并得到不会崩溃的合理结果。
示例:我编写了一个辅助函数,以一种漂亮的形式打印当前队列内容。如果我输入表达式 (6 + 9) - (9 + 6 + 3) + 2
,队列打印:
ADD->|| 6| 9 | + | 9 | 6 | + | 3 | + | 2 | + | - ||<-RMV
这当然是上述中缀表达式的错误后缀表示法。按照我的说法应该是:6 9 + 9 6 + 3 + - 2 +
你真的不需要知道更多,因为我的问题只是“AND 栈顶标记的优先级 >= 当前标记 “ 意思。我不明白它要我做什么。希望在我的 while 循环中解决这第三个 && (and) 条件将使我的算法输出正确的后缀表示法。
编辑 1:
既然我知道什么是优先级,我认为队列中的 (
可能在检查优先级方面发挥重要作用,因此,这是相同数学表达式的队列的原始输出作为上面的示例给出(我从上面另一个队列打印中的队列中删除了 (
因为我认为它们没用):
#######QUEUE#######
======================================================================
ADD->|| 6| 9 | + | 9 | 6 | + | 3 | + | 2 | + | ( | - | ( ||<-RMV
======================================================================
token的优先级是它在计算函数时的优先级。例如:最常用的数学运算符的优先级降序排列:() ^ */% +-.
您提到的条件阻止算法在队列中包含优先级高于当前运算符的任何运算符。
因为当前token必须是运算符所以我想这里的"the precedence"指的是运算符优先级,也就是说乘法和除法优先于加法和减法。这有意义吗?还是您只是加减法?
我无法理解我需要在以下 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 classes 并包括它们的功能和方法。这是任务的一部分。我无法使用默认的 Java 堆栈和队列结构(正如我所说,创建我们自己的并复制它们的功能是任务的一部分)。我 200% 这样 class 可以工作。我对它们进行了彻底的测试和调试,所以不用担心这种事情。
栈和队列都是
<String>
类型
堆栈是我的堆栈 class 的一个实例,它调用
isEmpty()
和 returns 一个布尔值(如果为空则为真,否则为假)。stack.peek()
调用 returns 对象,在本例中是堆栈顶部的字符串。整个算法的应用是将一个中缀形式的数学表达式的输入进行处理,并将其转化为后缀形式。
主要问题:我遗漏了最后一点伪代码。具体来说,该行: “AND 堆栈顶部令牌的优先级 >= 当前令牌”。我不明白它要求我检查什么,因此我没有对其进行编码(如您所见,我上面的 java 代码缺少最后一个 && 之后的代码)。我最好的猜测是,它要求我检查堆栈顶部下方的标记(也就是顶部之前的元素)是否 >= 当前标记, 必须是 一个运算符(否则,我们就不会进入上面的 if 语句)。我不知道如何将一个运算符与一个数字进行比较,并得到不会崩溃的合理结果。
示例:我编写了一个辅助函数,以一种漂亮的形式打印当前队列内容。如果我输入表达式 (6 + 9) - (9 + 6 + 3) + 2
,队列打印:
ADD->|| 6| 9 | + | 9 | 6 | + | 3 | + | 2 | + | - ||<-RMV
这当然是上述中缀表达式的错误后缀表示法。按照我的说法应该是:6 9 + 9 6 + 3 + - 2 +
你真的不需要知道更多,因为我的问题只是“AND 栈顶标记的优先级 >= 当前标记 “ 意思。我不明白它要我做什么。希望在我的 while 循环中解决这第三个 && (and) 条件将使我的算法输出正确的后缀表示法。
编辑 1:
既然我知道什么是优先级,我认为队列中的 (
可能在检查优先级方面发挥重要作用,因此,这是相同数学表达式的队列的原始输出作为上面的示例给出(我从上面另一个队列打印中的队列中删除了 (
因为我认为它们没用):
#######QUEUE#######
======================================================================
ADD->|| 6| 9 | + | 9 | 6 | + | 3 | + | 2 | + | ( | - | ( ||<-RMV
======================================================================
token的优先级是它在计算函数时的优先级。例如:最常用的数学运算符的优先级降序排列:() ^ */% +-.
您提到的条件阻止算法在队列中包含优先级高于当前运算符的任何运算符。
因为当前token必须是运算符所以我想这里的"the precedence"指的是运算符优先级,也就是说乘法和除法优先于加法和减法。这有意义吗?还是您只是加减法?