2010-08-30 307 views
4

这是在我试图用链表来实现队列代码:FIFO队列链表实现

#include <iostream> 
#include <cstdlib> 
using namespace std; 
template <class Item> 
class Queue{ 

public: 
    struct node{ 
     Item item;node *next; 
     node (Item x){ 
     item=x; next=0; 
     } 
    }; 
    typedef node* link; 
    link head, tail; 

public: 
    Queue(int){ head=0;} 
    int empty() const { return head==0; } 
    void put(Item x){ 

     node* t=tail; 
     tail=new node(x); 
     if (head==0) head=tail; 
     else t->next=tail; 
    } 
    Item get(){ 

     Item v=head->item;link t=head->next; 
     delete head; head=tail return v; 
    } 

    }; 

int main(){ 
    return 0; 
} 

,但我有指针的问题。例如,当我写Item v = head->它应该显示我选择项目的选项,但它不显示。也在其他地方的代码 - >这个标志码不给我选择项目或下一个的可能性。请帮忙。

+1

您可以发布具体的问题,包括适当的错误输出,错误消息和所需的输出。也请使用句子,你的问题很难阅读。 – 2010-08-30 12:26:27

+0

考虑'它应该让我选择':你想让你的IDE(你的编辑器)显示一个'head's成员列表吗?或者是其他东西? – phimuemue 2010-08-30 12:26:33

+0

是的成员,但它不显示我 – 2010-08-30 12:36:21

回答

3

ON: - >操作符可能被重载,因此开发环境无法确定如何处理它。如果您确实想要自动完成,您可以执行以下操作(暂时或永久)。

// IMPORTANT. Make sure "head" is not null before you do it! 
Node &headNode(*head); // Create a reference 
headNode.next = tail; // Use TAB or CTRL+SPACE or whatever here after dot 

OFF:我检查了您的代码,并取得了一定的修正

template <class Item> 
class Queue { 
public: 
     Queue() 
     : head(0) 
     , tail(0) 
     { } 
     bool empty() const { return head==0; } 
     void put(const Item& x) 
     { 
       Node* t = tail; 
       tail = new Node(x); 
       if (head==0) 
         head = tail; 
       else 
         t->next = tail; 
     } 
     Item get() 
     { 
       Item v = head->item; 
       Link t = head->next; 
       delete head; 
       head = t; 
       if(head==0) 
         tail = 0; 
       return v; 
     } 
private: 
     struct Node { 
       Item item; 
       Node *next; 
       Node(const Item& x) 
       : item(x) 
       , next(0) 
       {} 
     }; 
     typedef Node* Link; 
     Link head,tail; 
}; 
  • 删除intQueue构造
  • 更名nodeNodelinkLink因为ItemItem类型的无名参数,而不是item。只是为了使它有点标准化
  • 初始化tail构造函数Queue
  • 尽可能使用初始化程序列表而不是代码。
  • 修复Queue::get(),如果队列变空,则将tail设置为零。
  • 使用的Queue::put()参数列表和恒定的参考Queue::Node::Node()
  • NodeLinkheadtail是私人从现在开始。
  • Queue::empty()从现在开始返回bool而不是int
3

重复使用现有容器可能会更好。

STL明确包含,例如,一个queue容器适配器(根据默认deque,这是最有效的选择)。

如果您不需要多态行为,那么您正在寻找std::queue<Item>,它非常高效(不仅仅是基于自定义列表的队列),而且您将避免内存管理问题。

如果您需要多态行为,请使用std::queue< std::unique_ptr<Item> >

+1

“不要重新发明轮子,除非你打算更多地了解轮子。” – Mizipzor 2010-08-30 12:39:47

+1

我认为你过度设计答案。他在编辑的自动完成功能方面存在问题。 – celavek 2010-08-30 12:47:40

+1

@cevalek:我想也是这样,但在评论之前并不清楚。有趣的是,我仍然为此付出了努力,所以我想我不是唯一一个没有接受真正问题的人。 – 2010-08-30 12:53:31