2016-09-13 3 views
0

Им очень смутно, почему моя очередь не работает, я считаю, что есть проблема в методах очереди и деактивации. но я не уверен, я должен реализовать класс с начальным размером массива, установленным в 8. Размер массива будет удвоен, как только количество элементов превысит размер. После удаления элемента с начала массива вам нужно сдвинуть все элементы в массиве на одну позицию слева. Напишите тестовую программу, которая добавляет 20 номеров от 1 до 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--; 
} 

Удалите время цикла. Если вы пытаетесь, чтобы убедиться, что это не пустое освобождение пакета из очереди очереди имеет, если проверку состояния, чтобы убедиться, что размер> 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() в тесте он не выводит вывод –