Когда я снимаю очередь с очереди в круговом массиве, мои элементы не отображаются должным образом - PullRequest
0 голосов
/ 18 октября 2019

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

Я пытался посмотреть в Интернете другие методы удаления очереди, чтобы увидеть, где я могу ошибаться, но безрезультатно, поскольку все они похожи на мой метод. Я проверил, связано ли это с установкой моей очереди [frontIndex] равной нулю, но когда я установил ее равной следующей переменной, она не удаляет предыдущий элемент и не отображается должным образом IE: 1-2-3-4-5(после завершения очереди) 2-2-3-4-5

Это мои переменные, а также мой метод удаления из очереди

private T[] queue; //Circular array of queue entries and one unused element 
private int frontIndex;
private int backIndex;
private boolean integrityOK;
private static final int DEFUALT_CAPACITY = 50;
private static final int MAX_CAPACITY = 10000;

    /////////////////////////THE ISSUE///////////////////
@Override
public T dequeue() {

    //Start of if
    if(isEmpty()) {
        System.out.println("Queue is empty");
    }//End of if

    //retrieve front than delete it
    T front = queue[frontIndex]; 
    queue[frontIndex] = null; 
    frontIndex = (frontIndex + 1) % queue.length; 
    return front;


}
    /////////////////THE ISSUE///////////////////

Это также мой метод toString

@Override
public String toString() {
    StringBuilder sb = new StringBuilder();
    int temp = 0;
    sb.append("queue: ( ");
    if(queue.length == 0) {
        sb.append("empty queue");
    }
    while(queue[temp]!=null) {
        sb.append(queue[temp].toString());
        sb.append("--->");
        temp++;
    }
    sb.append(")");
    return sb.toString();
}

это метод, который я тестирую в моем основном классе

public static void testIntegers() {
    System.out.println("\n\nTesting with some integers");

    ArrayQueue<Integer> myIntegerQueue = new ArrayQueue<>();

    int testSet[] = { 1, 2, 3, 4, 5 };

    for (int i = 0; i < testSet.length; i++) {
        myIntegerQueue.enqueue(testSet[i]);
    }
    System.out.println(myIntegerQueue);

    for (int i = 0; i < testSet.length; i++) {
        System.out.println("Dequeue " + myIntegerQueue.getFront());
        myIntegerQueue.dequeue();
        // System.out.println("Dequeue " + myIntegerQueue.dequeue());
        System.out.println(myIntegerQueue);
    }

    // What happens if we try to dequeue from an empty queue?
    System.out.println("Dequeue " + myIntegerQueue.getFront());
    myIntegerQueue.dequeue();
    System.out.println(myIntegerQueue);
}

Это то, что он показывает

  Testing with some integers
  queue: ( 1--->2--->3--->4--->5--->)
  Dequeue 1
  queue: ( )
  Dequeue 2
  queue: ( )
  Dequeue 3
  queue: ( )
  Dequeue 4
  queue: ( )
  Dequeue 5
  queue: ( )
  Queue is empty
  Dequeue null
  Queue is empty
  queue: ( )

после ожидаемого результата первой очереди

очередь: (2 ---> 3 ---> 4 ---> 5 --->)

фактический результат

очередь: ()

может кто-нибудь сообщить мнеили направьте меня в правильном направлении относительно того, что я делаю неправильно, потому что я в растерянности. заранее спасибо!

1 Ответ

0 голосов
/ 19 октября 2019

В вашем методе toString() вы устанавливаете temp=0, затем в цикле while вы получаете условие while(queue[temp]!=null), что означает, что этот цикл просматривает самое начало массива queue и проверяет, является ли он null, а не первый элемент, который проиндексирован frontIndex. Когда вы удаляете из очереди первый раз, вы устанавливаете первый индекс в массиве равным null, что приводит к тому, что цикл while в вашем методе toString() даже не запускается из-за условия while(queue[temp]!=null). Вместо установки temp=0, установите его как temp=frontIndex, и это должно вывести вашу очередь, как ожидается.

@Override
public String toString() {
    StringBuilder sb = new StringBuilder();
    int temp = frontIndex;
    sb.append("queue: ( ");
    if(queue.length == 0) {
        sb.append("empty queue");
    }
    while(queue[temp]!=null) {
        sb.append(queue[temp].toString());
        sb.append("--->");
        temp++;
    }
    sb.append(")");
    return sb.toString();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...