Как я могу заставить этот метод отображения очереди Java () работать со всеми размерами массива, а не только с [5]? - PullRequest
0 голосов
/ 28 февраля 2012
 // 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 ();прямо над вызовом на дисплее метод перестает работать, я знаю, что это потому, что фронт теперь = 4, а не 3, и он не будет вводить метод for, для которого фронт должен быть

Ответы [ 5 ]

2 голосов
/ 28 февраля 2012

Просто используйте что-то вроде:

public void display() {
    for (int i = 0; i < nItems; i++) {
        System.out.println(queArray[(front + i) % maxSize]);
    }
}
1 голос
/ 28 февраля 2012

По-моему, вы используете слишком много переменных, которые вам не нужны. Вам нужен только размер очереди и количество элементов.

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]);
  }
}
0 голосов
/ 28 февраля 2012

Когда очередь заполнена (тыл == maxSize - 1), и вы делаете вставку, она заменит первую элемент, поэтому я думаю, что строка nItems ++ не должна увеличиваться, когда очередь уже заполнена.

Редактировать: Избегайте операций с модулями, когда они вам не нужны, они потребляют много процессора.

0 голосов
/ 28 февраля 2012

Итак, сейчас происходит то, что j - это позиция элемента в вашем массиве, которая отличается от числа элементов, которые вы напечатали до сих пор.

Вам нужно либо использоватьдругой индекс, чтобы подсчитать, сколько элементов вы напечатали или проверить, в конце ли вы, сравнив j с rear.

0 голосов
/ 28 февраля 2012

Резервное хранилище для вашей очереди:

private long[] queArray;

Почему бы вам вместо этого не использовать:

private List<Long> queArray

и позволить List беспокоиться об изменении размера после add/remove операции.Ваша текущая реализация очереди должна точно знать, сколько элементов входит в очередь на строительстве.Это довольно неудобно для клиентов, использующих этот API.

Вы можете создать экземпляр queArray как:

queArray = new ArrayList<Long>();

в своем конструкторе.Как только вы по-настоящему поймете этот код, вы сможете сами приступить к беспокойству по поводу изменения размера логики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...