[英]Java - I was modifying a stack linked list into a queue linked list but my dequeue method still behaves like pop
private Node back
還沒有被使用,並且enqueue
(推送)和dequeue
(pop是)除了重命名一些東西之外還沒有真正被修改過。 同樣,這最初是一個堆棧,但我正在嘗試將其修改為隊列。 我在使用int
之前已經完成了非鏈接列表隊列和堆棧,但是對於對象和鏈接列表,我有點迷失。
public class DogQueue
{
private Node front = null;
private Node back = null;
private Node element = null;
private int counter = 0;
以上只是設置變量。
private class Node //This sets up the Linked List
//Data Structure with nodes.
{
private Dog doggy;
private Node nextNode;
private Node firstNode;
Node(Dog newDog)
{
doggy = newDog;
}
}
我不太了解的節點內容是上面的。
public void enqueue(Dog aDog) //This should enqueue
//an object of type Dog.
{
Node dogNode = new Node(aDog);
dogNode.nextNode = front;
counter++;
front = dogNode;
}
上面這里沒有修改push方法,只是重命名。
public Dog dequeue() //This should output
//the first entry in the list.
{
Dog firstDog = front.doggy;
element = front.firstNode;
counter--;
return firstDog;
}
上面這里是我最麻煩的地方 - 目前它的行為類似於pop(獲取和刪除列表中最后輸入的元素)。
public boolean isFull() //Checks to see if List is Full.
{
return ( counter == 5 );
}
我將計數器設置為最多5,所以我可以調試isFull。
public boolean isEmpty() //Checks to see if List is empty
{
if ( counter == 0 )
{
return true;
} else {
return false;
}
}
這只是說如果counter為零,則isEmpty為true(否則為false)。
}
我吮吸數據結構,但我相信你的入隊和出隊仍然像pop和push一樣。 前面應指向隊列的頭部,尾部指向最后一個有效對象。 所以尾巴應該最終指向null ..我認為它應該是這樣的:
public void enqueue(Dog aDog)
{
Node dogNode = new Node(aDog);
counter++;
if (front == null)
front = back = dogNode;
else
{
back.nextNode = dogNode;
back = dogNode;
}
}
public Node dequeue()
{
if(front == null) return null;
Dog firstDog = front ;
front = front.nextNode;
counter--;
return firstDog;
}
這是主要問題。 隊列是FIFO(先進先出),堆棧是LIFO(后進先出)。 對於隊列,您排隊的第一個元素是您收到的第一個元素,並且您推入堆棧的最新元素是您收到的第一個元素。
為此,讓我們稍微檢查一下你的代碼。
public void enqueue(Dog aDog) { //This should enqueue an object of type Dog.
Node dogNode = new Node(aDog);
dogNode.nextNode = front;
counter++;
front = dogNode;
}
您將新狗元素的下一個節點設置在前面。 您必須轉到隊列的末尾,將最近的節點設置為新節點,並將新節點設置為null。 使用您的代碼,它看起來像這樣:
public void enqueue(Dog aDog) {
if(front == null) {
front = new Node(aDog);
back = front; // back will move later
} else {
Node tmp = new Node(aDog);
tmp.setFirstNode(back);
back.setNextNode(tmp);
back = tmp;
}
}
public Dog dequeue() { //This should output the first entry in the list.
Dog firstDog = front.doggy;
element = front.firstNode;
counter--;
return firstDog;
}
至少,這確實顯示了隊列中的第一件事。 但它實際上並沒有移動頭指針! 使用您的代碼,為此,它看起來像這樣:
public Dog dequeue() {
if(head == null) {
return null;
} else {
Dog tmp = front.getDoggy()
front = front.getNextNode(); //move the front to point to the next location
front.getFirstNode().setNextNode(null); //sever the link to the first element
front.setFirstNode(null); //sever the link to the first element
return tmp;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.