2012-02-27 1 views
0
// Queue.java 
// demonstrates queue 
// to run this program: C>java QueueApp 

class Queue 
{ 
private int maxSize; 
private long[] queArray; 
private int front; 
private int rear; 
private int nItems; 

public Queue(int s)   // constructor 
    { 
    maxSize = s; 
    queArray = new long[maxSize]; 
    front = 0; 
    rear = -1; 
    nItems = 0; 
    } 

public void insert(long j) 
    { 
    if(rear == maxSize-1)   
    rear = -1; 
    queArray[++rear] = j;   
    nItems++;      
    } 


public long remove()   
    { 
    long temp = queArray[front++]; 
    if(front == maxSize)   
    front = 0; 
    nItems--;      
    return temp; 
    } 

public long peekFront()  
    { 
    return queArray[front]; 
    } 

public boolean isEmpty() // true if queue is empty 
    { 
    return (nItems==0); 
    } 

public boolean isFull()  // true if queue is full 
    { 
    return (nItems==maxSize); 
    } 

public int size()   // number of items in queue 
    { 
    return nItems; 
    } 


public void display() 
{ int startFront = front; 

    for (int j = front ;j <nItems; j++) 
    { 
     System.out.println(queArray[j]); 
     if (j == nItems-1) 
     {  j=0; 
       System.out.println(queArray[j]); 
     } 


     if (j==startFront-1) 
      return; 

     } 
      } 
     } 

class QueueApp 
    { 
     public static void main(String[] args) 
    { 
    Queue theQueue = new Queue(5); // queue holds 5 items 

    theQueue.insert(10);   // insert 4 items 
    theQueue.insert(20); 
    theQueue.insert(30); 
    theQueue.insert(40); 

    theQueue.remove();    // remove 3 items 
    theQueue.remove();    // (10, 20, 30) 
    theQueue.remove(); 

    theQueue.insert(50);   // insert 4 more items 
    theQueue.insert(60);   // (wraps around) 
    theQueue.insert(70); 
    theQueue.insert(80); 


    theQueue.display(); 


    while(!theQueue.isEmpty()) // remove and display 
    {       // all items 
    long n = theQueue.remove(); // (40, 50, 60, 70, 80) 
    System.out.print(n); 
    System.out.print(" "); 
    } 
    System.out.println(""); 

    } // end main() 
} // end class QueueApp 

さて、これは基本的な、本のうち、キューコードです。私は、キューを順番に、前面から背面に表示する表示方法を作成しようとしています。 (これは割り当てです、私はこれが実用的ではないことを知っています....)もし私がプログラムを実行していれば、それはフロントからリアまで順番にキューを表示します。私が抱えている問題は、もし私がnItemsを変更すると、動作しなくなります。たとえば、コード行を追加すると、theQueue.remove();ディスプレイへの呼び出しの直上で、メソッドは機能しなくなります。フロントは3に代わって4になり、フロントがになる必要があるforのメソッドには入りません.Itets、4 < 4は真ではないので、forループは開始しません。このJavaキューのdisplay()メソッドは[5]の代わりにすべての配列サイズで動作させるにはどうすればよいですか?

+0

キューtheQueue =新しいキュー(5)。キューサイズを5にハードコードしないでください。入力がサイズを決定します。 Scannerを使用してキューサイズを問い合わせます。 – kosa

答えて

2

は単にのようなものを使用します。

public void display() { 
    for (int i = 0; i < nItems; i++) { 
     System.out.println(queArray[(front + i) % maxSize]); 
    } 
} 
+0

これは完全に動作しますが、私には1つの質問があります。私は、Forループがどのように機能するかを理解しており、配列内の各項目に対して以下のことを行います。今、私が読​​むことができるように、スクリーンにプリントする、フロントプラスの値、コード内で正確に何をするのですか?私はそれが使用されたのを初めて見ました。 – Renuz

+0

'%'はモジュロ演算子であり、残りはa.k.aです。 「i」が無限に増分すると仮定すると、「i%5」の値は0,1,2,3,4,0,1,2,3,4,0,1,2等となる。 –

-2

あなたのキューのバッキングストアがある:

あなたの代わりに使用していないのはなぜ
private long[] queArray; 

private List<Long> queArray 

add/remove操作後のサイズ変更の努力についてList心配をしましょう。現在のキューインプリメンテーションでは、作成時にキューに入る要素の数を正確に把握する必要があります。これは、このAPIを使用するクライアントにとってはかなり不便です。

あなたはとしてqueArrayをインスタンス化することができます:あなたのコンストラクタで

queArray = new ArrayList<Long>(); 

。そのコードを理解したら、リサイジングロジックについて心配する必要があります。

+1

質問には一切触れません。 – trutheality

+1

それは割り当てのために、おそらくそれをそのようにしなければなりません。 – Dan675

+0

@trutheality、私は同意しない。私は彼の現在の実装がうまくいかない理由、そして彼がそれを修正するために何ができるのかを指摘しています。 –

0

のでjは、あなたがこれまでに印刷されてきた要素の数は異なっている、あなたの配列内の要素の位置であることで、今何が起こっていますか。

jrearを比較することによって、印刷する要素数をカウントするか、最後にいるかどうかを確認するために、別のインデックスを使用する必要があります。

0

キューがいっぱい(rear == maxSize - 1)で挿入を実行すると、最初の アイテムが置き換えられるので、キューがすでにいっぱいになると、nItems ++の行を増やすべきではないと思います。

編集:あなたがそれらを必要としないとき、彼らはCPUを大量に消費するモジュラス演算を避けてください。

1

あなたが必要としない変数が多すぎます。キューサイズとアイテム数だけが必要です。

public Queue(int s) { 

    size = s; 
    queArray = new long[s]; 
    nItems = 0; 

} 

public void insert(long j) { 

    if(nItems < size) { 
     queArray[nItems] = j; 
     nItems++; 
    }      
} 

public long remove() { 
    if(nItems > 0) { 
    long temp = queArray[nItems]; 
    nItems--;      
    return temp; 
    } 
} 

public void display() { 

    for(int j = 0; j < nItems; j++) { 
    System.out.println(queArray[j]); 
    } 
} 
関連する問題