我正在尝试使用递归来反转队列。我已经使用队列和堆栈实现了该过程,但我也想学习递归方式。
以下是来自此网站
的代码import java.io.*;
import java.util.*;
class GFG {
// Utility function to print the queue
public static void Print(Queue<Integer> Queue)
{
while (Queue.size() > 0) {
System.out.print(Queue.peek() + " ");
Queue.remove();
}
}
// Function to reverse the queue
public static void reverseQueue(Queue<Integer> q)
{
// base case
if (q.size() == 0)
return;
// storing front(first element) of queue
int fr = q.peek();
// removing front
q.remove();
// asking recursion to reverse the
// leftover queue
reverseQueue(q);
// placing first element
// at its correct position
q.add(fr);
}
public static void main(String[] args)
{
Queue<Integer> Queue = new LinkedList<>();
Queue.add(10);
Queue.add(20);
Queue.add(30);
Queue.add(40);
Queue.add(50);
Queue.add(60);
Queue.add(70);
Queue.add(80);
Queue.add(90);
Queue.add(100);
reverseQueue(Queue);
Print(Queue);
}
}
现在我对reverseQueue()方法存在疑问,前面的值使用peek()存储在变量fr中。现在我的疑问是这个函数如何反转队列? fr 的值每次都会改变。 fr 的最后一个值包含队列中的 40 (10,20,30,40)。值 30,20 和 10 是如何存储的?
值 30,20 和 10 是如何存储的?
这个问题似乎表明您认为只有一个
fr
变量。这不是真的。 fr
是reverseQueue
执行期间存在的局部变量。由于您有多次
reverseQueue
的执行,因此您拥有尽可能多的 fr
变量,并且每个变量都有不同的值。一旦递归调用完成并且 reverseQueue
的当前执行可以继续,它将可以访问自己的 fr
变量,该变量不受任何更深层次的递归调用的影响。
希望能解答您的疑问。
关于另一个主题:您的
Print
函数会删除给定队列中的所有元素。这很奇怪:没有人会想到打印队列后它会变成空的。