尝试在Java中反转队列

问题描述 投票:0回答:1

我正在尝试使用递归来反转队列。我已经使用队列和堆栈实现了该过程,但我也想学习递归方式。

以下是来自此网站

的代码
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 是如何存储的?

linked-list queue dsa
1个回答
0
投票

值 30,20 和 10 是如何存储的?

这个问题似乎表明您认为只有一个

fr
变量。这不是真的。
fr
reverseQueue执行期间存在的
局部
变量。由于您有多次
reverseQueue
的执行,因此您拥有尽可能多的
fr
变量,并且每个变量都有不同的值。一旦递归调用完成并且
reverseQueue
的当前执行可以继续,它将可以访问自己的
fr
变量,该变量不受任何更深层次的递归调用的影响。

希望能解答您的疑问。

关于另一个主题:您的

Print
函数会删除给定队列中的所有元素。这很奇怪:没有人会想到打印队列后它会变成空的。

© www.soinside.com 2019 - 2024. All rights reserved.