1

1) 私の問題

右または左のプログラムから削除すると、削除はtrueになりますが、表示メソッドを呼び出すと、コンテンツが間違っています

このように12 43 65 23を挿入し、左のプログラムから削除すると12が削除されますが、表示メソッドを呼び出すと、この12 43 65のように表示されます

そして、正しいプログラムから削除すると23が削除されますが、表示メソッドを呼び出すと、この12 43のように表示されます

どうして ??????);

そして、削除後に挿入しようとすると、これを書きます

キューがいっぱいのため、正しく挿入できません。最初に右を削除してから、右を挿入できます

問題はどこだ ??

私を助けてください

お願いします

2) 私のコード

ファーストクラス

class dqueue
{
    private int fullsize;                    //number of all cells
    private int item_num;                    // number of busy cells only
    private int front,rear;
    public int j;
    private double [] dqarr;
//==========================================
    public dqueue(int s)                      //constructor
    {
        fullsize = s;
        front = 0;
        rear = -1;
        item_num = 0;
        dqarr = new double[fullsize];
    }
//==========================================
    public void insert(double data)
    {
        if (rear == fullsize-1)
            rear = -1;
        rear++;
        dqarr[rear] = data;
        item_num++;

    }
   public double removeLeft() // take item from front of queue
     {
   double temp = dqarr[front++]; // get value and incr front
   if(front == fullsize) 
   front = 0;
   item_num --; // one less item
   return temp;
    }
    public double removeRight() // take item from rear of queue
     {
   double temp = dqarr[rear--]; // get value and decr rear
   if(rear == -1) // 
   rear = item_num -1;
   item_num --; // one less item
   return temp;
    }
//=========================================

     public void display ()                //display items
{
for (int j=0;j<item_num;j++)               // for every element 
System.out.print(dqarr[j] +"  " );          // display it 
System.out.println("");
}

//=========================================
public int size()              //number of items in queue
{
return item_num;
}
//==========================================
public boolean isEmpty()       // true if queue is empty
{
return (item_num ==0);
}


} 

セカンドクラス

import java.util.Scanner;
class dqueuetest
{
    public static void main(String[] args)
    {
        Scanner input = new Scanner(System.in);
        System.out.println("              ***** Welcome here***** ");
        System.out.println("              *****  Mind Of Programming Group***** ");
       System.out.println("               _____________________________________________ ");
        System.out.println("enter size of your dqueue");
        int size = input.nextInt();
        dqueue mydq = new dqueue(size);
        System.out.println("");
        System.out.println("enter your itemes");
//=====================================
        for(int i = 0;i<=size-1;i++)
        {
           System.out.printf("item %d:",i+1);
           double item = input.nextDouble();
           mydq.insert(item);
           System.out.println("");
        }    

//=====================================  
int queue =size ;         
int c = 0 ;
while (c != 6)
{
    System.out.println("");
    System.out.println("************************************************");
    System.out.println("               MAIN MENUE");
    System.out.println("1- INSERT RIGHT  ");
    System.out.println("2- REMOVE LEFT");
    System.out.println("3- REMOVE RIGHT");
    System.out.println("4- DISPLAY");
    System.out.println("5- SIZE");
    System.out.println("6- EXIT");  
    System.out.println("************************************************");
    System.out.println("choose your operation by number(1-6)");  
    c = input.nextInt();
    switch  (c)
    {
    case 1:
   if (queue == size)
    System.out.print("Can not insert right because the queue is full . first remove right and then u can insert right   ");
          else { System.out.print("enter your item: ");
           double item = input.nextDouble();
           mydq.insert(item);}
          break;

   case 2:
       System.out.println("REMOVE FROM REAR :");
              if( !mydq.isEmpty() )
    {
  double item = mydq.removeLeft();

  System.out.print(item + "\t");
    } // end while
  System.out.println("");
  mydq.display();

    break;

   case 3:
    System.out.println("REMOVE FROM FRONT :");
            if( !mydq.isEmpty() )
    {
  double item = mydq.removeRight();

  System.out.print(item + "\t");
    } // end while
  System.out.println("");
  mydq.display();
     break;

    case 4:
    System.out.println("The items in Queue are :");  
        mydq.display();
    break;

    case 5:
     System.out.println("The  Size of the Queue is :"+mydq.size());
    break;

    case 6:
    System.out.println("Good Bye");

    break;

    default:
    System.out.println("wrong chiose enter again");
  }       //end switch
 }       //end while
}        // end main     

}//end class
4

3 に答える 3

1

それがあなたを最も混乱させるのはあなたのdisplay方法だと思います...:

public void display ()                //display items
{
    for (int j=0;j<item_num;j++)               // for every element 
        System.out.print(dqarr[j] +"  " );          // display it 
    System.out.println("");
}

frontこのメソッドでは、コーディングしたキューの「内部論理構造」が完全に無視されます。これは、インデックスとインデックスに大きく依存します。実際、ここではこれらのインデックスのどちらにも言及rearしていないことに注意してください。 「 「物理的に最初の」要素。「論理的に存在する」要素とはまったく関係がありません。item_num

代わりに、front(th要素ではなく0)th要素から始めて、そこから始まる要素を表示するitem_num必要があります(もちろん、それに会った場合は最後にラップアラウンドを使用します)。これにより、キューを実装する配列の「ランダムOID」スライスではなく、キューの論理コンテンツが表示されます!-)

于 2010-05-23T15:20:36.160 に答える
1

の実装はdisplay、バッキング配列を0からまで繰り返すitem_numため、間違った値を出力します。代わりに(バッファの最後でインデックスをラップアラウンドするためのチェックを使用して)からfrontを繰り返して、キューの実際の内容を出力する必要があります。rear

public void display() {
  int j = front;
  for (int count = 0; count < item_num; count++) {
    System.out.print(dqarr[j] + "  ");
    j = increment(j);
  }
  System.out.println();
}

private int increment(int index) {
  if (index == fullsize - 1)
    return 0;
  return ++index;
}

インデックスステッピングを1つの場所に実装するメソッドを定義しましたincrement。これは、コード内の複数の場所にあります。

さらに、実装にはオーバーフローチェックがないことに注意してください。fullsize + 1キューに要素を追加すると、最初の要素がサイレントに上書きされます。

Update: I realized that in your queue implementation rear indexes the last element of the queue (not the one after the last element, as is usual in dequeue implementations I have seen), so I modified the code example and my answer accordingly.

于 2010-05-23T15:23:43.167 に答える
0

これが宿題ではなく、Java 6以降を使用している場合は、組み込みのDequesで使用してみませんか?

それらはArrayDequeLinkedList(Java 6でこのインターフェースに後付けされた)、および並行で構成されLinkedBlockingDequeます。

于 2010-05-24T19:42:15.563 に答える