簡體   English   中英

Java - 我正在將堆棧鏈表修改為隊列鏈表,但我的dequeue方法仍然像pop一樣

[英]Java - I was modifying a stack linked list into a queue linked list but my dequeue method still behaves like pop

private Node back還沒有被使用,並且enqueue (推送)和dequeue (pop是)除了重命名一些東西之外還沒有真正被修改過。 同樣,這最初是一個堆棧,但我正在嘗試將其修改為隊列。 我在使用int之前已經完成了非鏈接列表隊列和堆棧,但是對於對象和鏈接列表,我有點迷失。

public class DogQueue 
{
    private Node front = null;
    private Node back = null;
    private Node element = null;
    private int counter = 0;

以上只是設置變量。

  private class Node //This sets up the Linked List
                     //Data Structure with nodes.
  {
      private Dog doggy;
      private Node nextNode;
      private Node firstNode;

      Node(Dog newDog)
      {
          doggy = newDog;
      }    
  }

我不太了解的節點內容是上面的。

  public void enqueue(Dog aDog) //This should enqueue
                                //an object of type Dog.
  {       
      Node dogNode = new Node(aDog);
      dogNode.nextNode = front;
      counter++;
      front = dogNode;
  }

上面這里沒有修改push方法,只是重命名。

  public Dog dequeue()      //This should output
                            //the first entry in the list.
  {
      Dog firstDog = front.doggy;
      element = front.firstNode;
      counter--;
      return firstDog;
  }

上面這里是我最麻煩的地方 - 目前它的行為類似於pop(獲取和刪除列表中最后輸入的元素)。

  public boolean isFull()   //Checks to see if List is Full.
  {
      return ( counter == 5 );
  }

我將計數器設置為最多5,所以我可以調試isFull。

  public boolean isEmpty()  //Checks to see if List is empty
  {
      if ( counter == 0 )
        {
            return true;
        } else {
            return false;
        }
  }

這只是說如果counter為零,則isEmpty為true(否則為false)。

}

我吮吸數據結構,但我相信你的入隊和出隊仍然像pop和push一樣。 前面應指向隊列的頭部,尾部指向最后一個有效對象。 所以尾巴應該最終指向null ..我認為它應該是這樣的:

  public void enqueue(Dog aDog)
     {
         Node dogNode = new Node(aDog);

         counter++;
         if (front == null)
             front = back = dogNode;
         else
         {
             back.nextNode = dogNode;
             back = dogNode;

         }
     }
  public Node dequeue()      
  {
      if(front == null) return null;
      Dog firstDog = front ;
      front = front.nextNode;
      counter--;
      return firstDog;
  }

這是主要問題。 隊列是FIFO(先進先出),堆棧是LIFO(后進先出)。 對於隊列,您排隊的第一個元素是您收到的第一個元素,並且您推入堆棧的最新元素是您收到的第一個元素。

為此,讓我們稍微檢查一下你的代碼。

  public void enqueue(Dog aDog) { //This should enqueue an object of type Dog.
      Node dogNode = new Node(aDog);
      dogNode.nextNode = front;
      counter++;
      front = dogNode;
  }

您將新狗元素的下一個節點設置在前面。 您必須轉到隊列的末尾,將最近的節點設置為新節點,並將新節點設置為null。 使用您的代碼,它看起來像這樣:

public void enqueue(Dog aDog) {
    if(front == null) {
        front = new Node(aDog);
        back = front; // back will move later
    } else {
        Node tmp = new Node(aDog);
        tmp.setFirstNode(back);
        back.setNextNode(tmp);
        back = tmp;
    }
}

  public Dog dequeue() {      //This should output the first entry in the list.
      Dog firstDog = front.doggy;
      element = front.firstNode;
      counter--;
      return firstDog;
  }

至少,這確實顯示了隊列中的第一件事。 但它實際上並沒有移動頭指針! 使用您的代碼,為此,它看起來像這樣:

public Dog dequeue() {
    if(head == null) {
        return null;
    } else {
        Dog tmp = front.getDoggy()
        front = front.getNextNode(); //move the front to point to the next location
        front.getFirstNode().setNextNode(null); //sever the link to the first element 
        front.setFirstNode(null); //sever the link to the first element
        return tmp;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM