2014-02-16 85 views
1

我目前正在研究類的項目,該類需要我在不使用庫的情況下實現帶有鏈接列表的隊列。到目前爲止,我的項目工作得很好,但是當我push_back()1,3,5,7時,屏幕在左邊的隊列前面顯示它。我寧願它看左後方,如REAR 7 5 3 1 FRONT。我在這裏錯過了什麼,可以幫助我做到這一點?顯示使用鏈接列表從後端到前端實現的隊列

#include "queue.h" 
#include <iostream> 
Queue::Queue() 
{ 
    queue_size = 0; 
    front = 0; 
    rear = 0; 
} 
Queue::~Queue() 
{ 
    delete front; 
    delete rear; 
} 

void Queue::push_back(int x) 
{ 
    node * q = new node; 
    q->data = x; 
    q->next = 0; 

    if(this->isEmpty()) 
    { 
     front = q; 
     front ->next = 0; 
     rear = front; 
    } 
    else 
    { 
     rear->next = q; 
     rear = rear->next; 
     rear->next = 0; 
    } 
    queue_size = queue_size + 1; 
} 

void Queue::pop_front(int &num) 
{ 
    node * temp; 
    num = front->data; 
    temp = front; 
    front = front ->next; 
    delete temp; 
    queue_size = queue_size - 1; 



} 
bool Queue::isEmpty() 
{ 
    if(front == 0) 
     return true; 

    else 
     return false; 

} 

int Queue::ret_size() 
{ 
    return queue_size; 
} 

void Queue::display() 
{ 
    node * temp; 
    temp = front; 

    for(int i = 0; i < queue_size; i++) 
    { 
     std::cout<<temp->data<< " "; 
     temp = temp->next; 
    } 
    std::cout<<"\n"; 
} 
+0

我看到你在下面得到了你需要的答案。然而,我想我會拋出改變你的節點類/結構的想法。您可以添加另一個名爲「prev」的節點*字段並使用Double鏈接列表實施隊列。這將允許您使用後指針向後走過隊列。實際上,這將比使用遞歸方法運行得更快,並且還避免了可能的堆棧溢出。但是,每個節點還有一個額外的4字節,刪除和添加節點的邏輯稍微複雜一些。只是你可以考慮的另一種設計。 –

回答

1

如果您對遞歸感到滿意,並且有一些信念認爲您的系統具有足夠的堆棧以滿足您計劃的隊列的大小,這可以工作。

void Queue::display(void) 
{ 
    node* temp; 
    temp = front; 

    if(temp) 
     temp->displayR(); 

    std::cout<<"\n"; 
} 

void Queue::displayR(void) 
{ 
    if(m_next) 
     m_next->displayR(); // spin down to end of queue 

    // now display the current data 
    std::cout << data << " "; // report end of queue first 
} 

FYI:在Ubuntu 12.04和RAM的4千兆,我相信我不會遇到堆棧溢出,直到隊列中的100K以上的元素。你的結果會有所不同......


如果你沒有信心,只是您的隊列中的內容轉移到一個載體,然後反向顯示向量的內容。

由於它很容易,並且您想要避免使用庫,只需使用一個數組即可。

+0

隊列不會大於5個整數,所以這將完美工作!感謝您的幫助! – Josamoda

0

爲什麼你不能簡單地在display()中反轉循環,所以它從後面開始向前移動?

+0

你能否提供一個例子來說明如何做到這一點?我仍然是一個新手在c + + – Josamoda

+0

我在想的是用temp = temp和temp = temp-> next用temp = temp-> prev替換temp = front。我對這個簡潔的答案表示歉意 - 我在一個小平板電腦上打字 - 希望這足以幫助你解決問題。 –

+0

我添加了一條關於修改節點對象的評論。該節點可能只有一個「下一個」指針......又名單鏈表。但是,如果節點更改並且更新了隊列邏輯,則可以使用雙向鏈接列表以及您所描述的方法。這就是我個人如何實現自己的隊列。 –