Java: для l oop не исключается из очереди каждый элемент в очереди - PullRequest
1 голос
/ 12 апреля 2020

В настоящее время у меня есть связанная очередь с тремя элементами в ней.

LinkedQueue<Integer> queue = new LinkedQueue(); 
queue.enqueue(1);
queue.enqueue(2); 
queue.enqueue(3); 

На этом этапе queue.toString () дает мне:

<Front>
1
2
3
<Rear>

Я пытаюсь написать для l oop, который проходит через очередь, удаляет ее элементы и помещает эти элементы во временную очередь.

LinkedQueue<Integer> temp = new LinkedQueue(); 
for (int i = 0; i < queue.size(); i++) {
   Integer int = queue.dequeue(); 
   temp.enqueue(int); 
}

queue.size () возвращает 3, что является правильным числом элементов в очереди, поэтому тело l oop должно выполняться три раза. Однако, когда я помещаю в свой оператор print для l oop, который проверяет элементы очереди и температуры на каждой итерации, остается только две итерации.

Temp:
<Front>
1
<Rear>
Queue:
<Front>
2
3
<Rear>

Temp:
<Front>
1
2
<Rear>
Queue:
<Front>
3
<Rear>

Я не уверен, почему он пропускает последнюю итерацию, что должно дать

Temp:
<Front>
1
2
3
<Rear>
Queue:
<Front>
<Rear>

Чтобы проверить, я изменил "i

LinkedQueue<Integer> temp = new LinkedQueue(); 
for (int i = 0; i < queue.size(); i++) {
   Integer int = queue.dequeue(); 
   temp.enqueue(int); 
}
Integer int = queue.dequeue();
temp.enqueue(int); 

, что заставило его работать.
TL; DR. Я абсолютно не знаю, почему my for l oop не выполняет правильное количество раз.

Ответы [ 2 ]

2 голосов
/ 12 апреля 2020

Когда вы снимаете с очереди, queue.size() меняется!

Поэтому после первой итерации queue.size() равно 2, а i равно 1. После второй итерации queue.size() равно 1 и i равно 2. Это приводит к остановке l oop. Ваша попытка изменить < на <= не сработала, потому что это не ошибка выключения на 1, а ошибка выключения на 2:)

Чтобы исправить это, сохраните размер в переменную перед началом l oop:

LinkedQueue<Integer> temp = new LinkedQueue(); 
int size = queue.size();
for (int i = 0; i < size; i++) {
   Integer number = queue.dequeue(); 
   temp.enqueue(number); 
}

Или используйте while(!queue.isEmpty()) l oop:

LinkedQueue<Integer> temp = new LinkedQueue(); 
while(queue.size() > 0) {
   Integer number = queue.dequeue(); 
   temp.enqueue(number); 
}
1 голос
/ 12 апреля 2020

После вызова queue.deque() размер очереди уменьшается. Вы можете сохранить размер очереди в другой переменной:

for (int i = 0, n = queue.size(); i < n; i++) {
   Integer value = queue.dequeue(); 
   temp.enqueue(value); 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...