2016-09-13 5 views
0

私のキューが動作しない理由について非常に混乱しています。エンキューとデキューのメソッドに問題があると思います。しかし、私は確信していません、私は8に設定された初期配列のサイズでクラスを実装することになっています。配列のサイズは、要素の数がサイズを超えると倍増します。要素が配列の先頭から削除されたら、配列のすべての要素を1つ左の位置に移動する必要があります。 1から20までの20個の数値をキューに追加し、これらの数値を削除して表示するテストプログラムを作成します。ここに私のコードは配列を持つキューを実装しています

public class Queue { 
    private int[] elements; 
    private int size; 
    private int first; 
    private int last; 
    public static final int DEFAULT_CAPACITY = 8; 

    public Queue(){ 
     this (DEFAULT_CAPACITY); 
    } 
    public Queue (int capacity){ 
     elements = new int[capacity]; 
     first = 0; 
     last = 0; 
     size = 8; 
    } 
    public void Enqueue(int v){ //fills queue and lengthens if necessary 
     if (last>=size){ 
      int[] temp = new int[elements.length*2]; 
     System.arraycopy(elements, 0, temp, 0, elements.length); 
      elements = temp; 
     } 
     elements[last]=v; 
     last++; 

    } 
    public int Dequeue(){  
     int output = elements[first]; 
     System.out.print(output + " "); 
     while(last != 0){ 
      for(int i = 0; i<last;i++){ 
       elements[i]= elements[i-1]; 
      } 
      last--; 
     } 
     return output ; 
    } 
    public boolean empty(){ // tests for empty queue 


     return last==first; 

    } 
    public int getSize(){ 
     size=last; 
     return size; 
    } 
    } 

ここにテスタークラスです。

public class QueueTester { 
    public static void main(String[] args){ 
     Queue q = new Queue(); 
     q.Enqueue(1); 
     q.Enqueue(2); 
     q.Enqueue(3); 
     q.Enqueue(4); 
     q.Enqueue(5); 
     q.Enqueue(6); 
     q.Enqueue(7); 
     q.Enqueue(8); 
     q.Enqueue(9); 
     q.Enqueue(10); 
     q.Enqueue(11); 
     q.Enqueue(12); 
     q.Enqueue(13); 
     q.Enqueue(14); 
     q.Enqueue(15); 
     q.Enqueue(16); 
     q.Enqueue(17); 
     q.Enqueue(18); 
     q.Enqueue(19); 
     q.Enqueue(20); 
     while (q.empty()){ 
      q.Dequeue(); 
+0

要素を最後ではなく開始点に挿入する必要がありますか?配列の最後にキューとデキューを行う方がずっと効率的です。 – sprinter

答えて

1
while(last != 0){ 
    for(int i = 0; i<last;i++){ 
     elements[i]= elements[i-1]; 
    } 
    last--; 
} 

whileループを削除します。あなたは、if条件チェックを持っているサイズは、あなたのテスタークラスの出力を印刷する必要がある、と私は仮定に加え> 0

public int Dequeue(){ 
     if (getSize() == 0) { 
      // throw an error or something 
     }  
     int output = elements[first]; 
     System.out.print(output + " "); 
     for(int i = 0; i<last;i++){ 
      elements[i]= elements[i-1]; 
     } 
     last--; 
     return output ; 
    } 

であることを保証するために、それは空のキューをデキューていないことを確認しようとしている場合あなたは、キューが空ではありませんがデキューしたい:

while (!q.empty()){ 
      System.out.println(q.Dequeue()); 
+0

テスターでq.dequeue()を呼び出すと出力が印刷されないため、これで問題は解決されません –

関連する問題