Почему очередь на основе массива не работает правильно в java - PullRequest
0 голосов
/ 19 апреля 2020

Таким образом, мы должны использовать предоставленные методы и переменные, не добавляя их, и что бы я ни пытался, я не могу заставить их работать. Я чрезвычайно новичок в очередях, поэтому, возможно, упускаю что-то маленькое. Вот мой код:

/**
  * Int Queue
  */
public class Queue{

/** Max num elements*/
private int numElements;

/** Array to save elements **/
private int elements[];

/** Indice to last element */
private int last;

/** Constructor to init the state object */
Queue(int numElements){
    this.numElements = numElements;
    this.elements = new int[numElements];
    this.last = -1;

}

/** Is empty the queue? */
public boolean isEmpty(){
    return (last == -1);
}

/** Is full the queue */
public boolean isFull(){
    return (numElements() == this.numElements);
}

/** Insert an element in the queue */
public void enqueue(int element) {

    last++; 

    elements[last]= element;

}

/** Extract the element in the queue.
 *  There isn't control error */
public int dequeue() {

    int elem = elements[0];

    for (int x = 0; x < last; x++){
        elements[x] = elements [x + 1];
    }

    last --;

    return elem;
}

/** Returns the number of elements in the queue */
public int numElements(){

    int number = 0;

    for (int x = 0; x < this.last; x++) {
        number++;
    }

    return number;
}

/** Print the elements in the queue*/
public void print(){

    System.out.println("\nElements: ");

   for(int b:elements){    
       System.out.println(b);    
   }    
}



  public static void main(String args[]){
     // test the class
     System.out.println("Test the queue class");
     Queue que = new Queue(4);
     que.enqueue(1);
     que.enqueue(4);
     que.enqueue(5);
     que.print();
     que.dequeue();
     que.dequeue();
     que.print();
   } // main

} // Queue

и он выводит:

Test the queue class

Elements: 
0
1
4
5

Elements: 
4
5
5
5

Я не в состоянии заставить его напечатать правильные параметры. Сначала он должен вывести 1 4 5 (не ноль), а затем должен вывести 1 и ничего больше. Спасибо за помощь, спасибо!

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

Ваша проблема только в том, как вы распечатываете свою очередь. Попробуйте вместо печати:

public void print(){

        System.out.println("\nElements: ");

        for(int c = 0; c < last+1; c++){    
            System.out.println(elements[c]);    
        }    
    }

Объяснение

Поскольку вы просто сдвигаете все на 1 пробел, когда что-то снимают с очереди, данные в конце не удаляются или «перемещаются вперед» Его просто копируют вперед. С вашим оригинальным отпечатком он просматривает все элементы во всем списке, а не только то, что мы считаем в очереди (что-либо меньше, чем в прошлом).

1 голос
/ 19 апреля 2020

Я запустил ваш код и получил следующие результаты:

Elements: 
1
4
5
0

Elements: 
5
5
5
0

Что имеет смысл, потому что ваш внутренний массив всегда будет иметь одинаковое количество значений, так как он имеет размер stati c (в вашем case 4).
Чтобы исправить это, вы можете переписать метод печати следующим образом:

public void print(){

    System.out.println("\nElements: ");

   for(int i = 0; i < numElements(); i++){    
       System.out.println(elements[i]);    
   }    
}

Также измените метод numElements:

public int numElements(){
    return last + 1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...