在 Java 中的队列链表中递归到字符串



我需要为链表队列实现一个toString((递归方法。我知道我的 toString 方法在上周所做的链表实现上工作正常,所以我如何处理它的队列方面有问题。

我的队列列表的 toString 方法:

public String toString() 
{ 
    if (front.info == null)
    {
        System.out.println("Error, queue is empty");
        return "";
    }
    if (front.link  == null) //base case: if this is last element in stack
    {
        return  (" "" + front.info + "" , ");
    } 
    else //normal recursive function
    {
        return  (" "" + front.info + "" , " + front.link.toString());
    }   
}

和我的构造函数等队列列表:

public class QueueNode 
{
    E info;
    QueueNode link;
}
private QueueNode front;//first element to be placed into queue
private QueueNode rear;//last element to be placed into queue
private int NoE;//counter for number of elements in queue
public QueueList() 
{ 
    front = null;
    rear = null;
    NoE = 0;
}

我试图使用此测试查看其中发生了什么:

public boolean test() { 
    QueueList<String> q = new QueueList<String>();
    q.enqueue("The Godfather");
    q.enqueue("Casino");
    q.enqueue("Goodfellas");
    String r = q.toString();
    q.PrettyPrint();

带输出

IN -> [ "The Godfather" , QueueList$QueueNode@a3901c6] -> OUT. 

我意识到这是因为我在toString方法的递归部分告诉front.link.toString(),但即使我将其更改为 front.link.info.toString() ,我的输出也是

IN -> [ "The Godfather" , Casino] -> OUT. 

这可能与我的排队和取消排队方法有关,如下所示:

public void enqueue(E element) 
{ 
        QueueNode newNode = new QueueNode();//creates new Node to hold element
        newNode.info = element;//set info of new Node to element
        newNode.link = null;//make link null since it's at back of list
        if (rear == null)//checks if queue is empty
        {
            front = newNode;
        }
        else
        {
            rear.link = newNode;//sets second to last node's link to newNode
        }
        rear = newNode;//makes newNode the new last link
        NoE++;//increase counter
}
public E dequeue() throws InvalidOperationException 
{
    if (front == null)//sanitize code
    {
        throw new InvalidOperationException("There is nothing in the queue.");
    }
    E element = front.info;//creates an element file that takes the info in front of queue
    front = front.link;//makes second-to-front element new front
    if (front == null)//if this emptied the queue, make sure rear is also empty
    {
        rear = null;
    }
    NoE--;//reduce counter
    return element;
}

如果可以的话,请帮助我。谢谢。

绝对没有必要使toString递归,事实上这样做是不正确的。您的数据结构不是递归的(即树(,而是线性的。

如果你的列表包含,比如说,100万个项目,你很快就会用完堆栈空间(字面意思是StackOverflow(。

请改用循环。

编辑:如果您需要递归执行此操作,那么问题是递归方法必须QueueNode#toStringRecursive(),而不是Queue#toString()。 该方法Queue#toString()分配一个缓冲区,并将其提供给执行递归QueueNode上的特殊toStringRecursive()方法。 QueueNode#toString()必须只对自己的节点内容负责。

方法Queue#toString()

public String toString()
{
    StringBuilder buf = new StringBuilder();
    if (front == null)
        // queue is empty
    else
        front.toStringRecursive(buf);
    return buf.toString();
}

方法QueueNode#toStringRecursive()

public void toStringRecursive(StringBuilder buf)
{
    buf.append(this.toString());
    if (this.link != null)
        this.toStringRecursive(buf);
}

其中QueueNode.toString()只负责串化一个节点(本身(。

请注意,这是一种方法。 也可以将其编写为Queue上的递归方法,但不能将其称为toString()Queue#toString()将设置初始条件,然后调用递归。

相关内容

  • 没有找到相关文章

最新更新