#java
#java
Вопрос:
Я пытаюсь реализовать очередь с циклическим связанным списком с одной ссылкой. Я полагаю, что это FIFO, основанный на тестах (rear обновляется, как и должно быть, каждый раз, когда элемент ставится в очередь), но он печатает в обратном порядке. Должен ли я ожидать этого, или я что-то упускаю? Я попытался изменить toString(). Вот мой класс circularlink queue:
public class CircularLinkedQueue implements UnboundedQueueInterface
{
protected LLObjectNode rear;
public CircularLinkedQueue()
{
rear = null;
}
public void enqueue(Object element)
{
LLObjectNode newNode = new LLObjectNode(element);
if (rear == null)
newNode.setLink(newNode);
newNode.setLink(rear);
rear = newNode;
}// end enqueue()
public Object dequeue() throws QueueUnderflowException
{
if (isEmpty())
throw new QueueUnderflowException("Dequeue attempted on an empty queue.");
else
{
Object element; // create a reference to the Object to return
element = rear.getLink(); // set the reference to the information in the front node
rear = rear.getLink(); // set the rear reference to point at the next node
return element;
}// end else
}// end dequeue()
public boolean isEmpty()
{
return (rear == null);
}// end isEmpty()
// *** Exercise #25b *** works
public Object front()
// returns a reference to the front element on the queue.
// precondition: queue is not empty.
{
Object frontObj;
frontObj = rear.getLink();
return frontObj;
}// end front()
public int size()
{
LLObjectNode node;
node = rear;
int count = 0;
while (node != null)
{
count ;
node = node.getLink();
}
return count;
}// end size()
public String toString()
{
String circleQStr = "";
LLObjectNode node;
int count = 0;
node = rear;
while (node != null)
{
count ;
circleQStr = circleQStr count ". " node.getInfo() "n";
node = node.getLink();
}// end while
return circleQStr;
}// end toString()
}// end class CircularLinkedQueue
Вот getLink()
и setLink()
:
public void setLink(LLObjectNode link)
{
// sets link of this LLObjectNode
this.link = link;
}
public LLObjectNode getLink()
{
// returns link of this LLObjectNode
return link;
}
Спасибо, что прочитали мой пост.
Ответ №1:
С этим кодом существует ряд проблем, которые, я думаю, не связаны с заявленной вами проблемой, но если ваш начальный узел является задним, то вам нужно продвинуться вперед перед печатью, иначе сначала будет напечатан задний. Также … я не думаю, что ваша size()
функция когда-либо вернется…в циклической очереди следующий элемент никогда не будет равен null. Также сложно отладить это без публикации кода для getLink()
и setLink()
Редактировать Хорошо, я думаю, проблема в том, что ваш enequeue
метод должен выглядеть следующим образом
public void enqueue(Object element)
{
LLObjectNode newNode = new LLObjectNode(element);
if (rear == null){
newNode.setLink(newNode);
}else{
newNode.setLink(rear.getLink());
rear.setLink(newNode);
}
rear = newNode;
}// end enqueue()
Кроме того, вам нужно изменить свой метод удаления из очереди. Прямо сейчас у вас есть обратная сторона, указывающая на элемент, который вы только что исключили из очереди.
public Object dequeue() throws QueueUnderflowException
{
if (isEmpty())
throw new QueueUnderflowException("Dequeue attempted on an empty queue.");
else
{
Object element; // create a reference to the Object to return
element = rear.getLink(); // set the reference to the information in the front node
rear.setLink(element.getLink()); // set the rear reference to point at the next node
return element;
}// end else
}// end dequeue()
Комментарии:
1. size () действительно работает. Я отредактировал, чтобы добавить
getLink()
иsetLink()
. Когда я взламываюtoString()
, я либо получаюNullPointerException
, либо не печатаю конечный элемент.2. @nerdess, хм, этого не должно быть. У вас никогда не должно быть
null
указателя nextItem в циклической очереди. Посмотрите мои правки выше и дайте мне знать, если это поможет.3. @nerdess, также посмотрите мои правки в вашем методе удаления из очереди. Когда вы отменяете очередь, поскольку она выходит из начала списка, вы не хотите изменять
rear
элемент, только то, на что он указывает.4. Спасибо! Я проверю это, когда вернусь к своей машине JDK сегодня вечером. 🙂
5. не работает, под чем я подразумеваю, что драйвер работает бесконечно. На данный момент мой драйвер состоит из пяти вызовов
enqueue()
со строками и инструкции print после каждого, чтобы проверить, чтоrear
обновляется. После этого я печатаю очередь. Раньше она печатала в обратном направлении, но теперь она вообще не печатается. :