3

private Node backはまだ使用されておらず、enqueue(プッシュ) とdequeue(ポップ) は、いくつかの名前を変更する以外は実際には変更されていません。繰り返しますが、これはもともとスタックでしたが、キューに変更しようとしています。以前に s を使用してリンクされていないリストのキューとスタックを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;
  }

上記は私が最も問題を抱えている場所です。現在、ポップのように動作します(リストに最後に入力された要素を取得して削除します)。

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

isFull をデバッグできるように、最大​​ 5 になるようにカウンターを設定しました。

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

これは、counter がゼロの場合、isEmpty が true (そうでない場合は false) であることを示しています。

}
4

2 に答える 2

0

これが主な問題です。キューは 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;
    }
}
于 2012-10-04T00:04:39.273 に答える
0

私はデータ構造が苦手ですが、エンキューとデキューはまだポップとプッシュのように動作していると思います。フロントはキューの先頭を指し、テールは最後の有効なオブジェクトの 1 つ後ろを指す必要があります。したがって、テールは最終的に 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;
  }
于 2012-10-03T23:49:24.120 に答える