2013-04-04 45 views
0

我目前正在修改我的編程考試,並且遇到了一個過去的問題,這讓我頗爲困惑。檢查一個隊列以打印所有元素

我有兩個類Queue和Node,如下所示。

的問題指出,我通過將必要的代碼來打印到控制檯存儲在隊列中的所有數據的方法inspectQueue延長隊列類的行爲。

我能想到的唯一解決方案是非常微弱的,那就是擁有一個簡單的ArrayList,並且每當一個元素入隊/出隊時,然後向/從列表中添加/刪除節點。

有沒有更好的解決方案,我正在掩飾?我真的很感激一些指導。

我已經評論了我已經實現了我的「解決方案」的代碼,其餘的代碼是它在考試論文中的顯示方式。

謝謝你的時間。

Queue.java

public class Queue { 

protected Node head; 
protected Node last; 

    //added by me 
    private ArrayList<Node> nodes = new ArrayList<Node>(); 
    //end my add 

public boolean isEmpty() { 
    return (this.head == null); 
} 

public void enqueue(Object d) { 
    Node n = new Node(); 
    n.setData(d); 
    nodes.add(n); //added by me 
    if (this.isEmpty()) { 
     head = n; 
     last = n; 

    } 
    else { 
     last.setNext(n); 
     last = n; 
    } 
} 

public Object dequeue() { 
    if(this.isEmpty()) { 
     this.last = null; 
     return null; 
    } 
    else { 
     Node h = this.head; 
        nodes.remove(h); //added by me 
     head = h.getNext(); 
     return h.getData(); 
    } 

} 

public Object peek() { 
    if(this.isEmpty()) { 
     return null; 
    } 
    else { 
     Node t = this.head; 
     return t.getData(); 
    } 
} 

public void clearQueue() { 
    this.head = null; 
    this.last = null; 
} 

public void inspectQueue() { 
     //added by me (all below) 
    System.out.println("Inspecting Queue: (contains " + nodes.size() + " nodes)"); 
    for(Node n : nodes) { 
     System.out.println(n.getData()); 
    } 
} 



} 

Node.java

public class Node { 

protected Object data; 
protected Node next; 

public void setNext(Node e) { 
    this.next = e; 
} 

public Node getNext() { 
    return this.next; 
} 

public void setData(Object d) { 
    this.data = d; 
} 

public Object getData() { 
    return this.data; 
} 


} 

回答

1

這是一個非常基本的數據結構,稱爲一個LinkedList。在Node類的代碼,你可以看到如下內容:

protected Node next; 

這意味着,每個節點還持有到列表中的下一個節點的引用。如果此節點爲null,則列表中不再有元素。知道這一點,你可以像這樣循環:

Node currentNode = this.head; 
while(currentNode != null) { 
    System.out.println(currentNode.getData().toString()); 
    currentNode = currentNode.getNext(); 
} 

這消除了ArrayList存儲引用的需要。 LinkedList是一個非常經常使用的數據結構,對於理解非常重要。如果您有任何問題,請繼續詢問!

如果你也想擁有大小,沿保留一個計數器,每次調用getNext()時間增加它,和之後的打印尺寸爲循環。

+0

感謝您的回答和附加說明。 – TEK 2013-04-04 13:40:27

0

的簡單的解決方法是先從queue.head並遍歷使用node.next節點的鏈表,當您去打印數據。

1

你不需要數組,你有一個存儲節點next屬性中的信息:

public void inspectQueue() { 
    Node current = head; 
    while(current != null) { 
     System.out.println(n.getData()); 
     current = current.getNext(); 
    } 
} 

該數據結構被稱爲linked list

+2

不應該是'while(current!= null)'和'current.getData()'? – OldCurmudgeon 2013-04-04 12:55:29

+1

如果隊列爲空,則會給NPE。 – 2013-04-04 12:56:00

+0

謝謝你倆:) – linski 2013-04-04 12:57:18

3

你的節點形成一個鏈表,所以只是做

public void inspectQueue() { 
    Node n = head; 
    while (n != null) { 
     System.out.println(n.getData()); 
     n = n.getNext(); 
    } 
} 
+0

呃。我需要對鏈表進行一些認真的研究。如此明顯卻完全讓我失望。非常感謝你。 – TEK 2013-04-04 12:59:14