自定义队列类C ++

时间:2012-12-09 00:26:19

标签: c++ class queue singly-linked-list

所以我正在尝试创建一个Singly-linked-list Queue。我正在尝试编写一个函数来添加元素,一切都很好,但问题是它的FILO而不是FIFO。我不知道如何处理我的前后指针。

#include <iostream>
#include <string>
using namespace std;

class Queue{
    public:
        Queue();
       //~Queue();
       void add(const string & item);
       //string remove();
      // unsigned items() const;
       void show() const;
    private:
        struct Node{
            string data;
            Node *next;
        };
        Node *rear;
        Node *front;
        unsigned elements;
};

Queue::Queue():elements(0),rear(NULL),front(NULL){}

//Queue::~Queue(){

//}

void Queue::add(const string & item){
    Node *t=new Node;
    t->data=item;
    t->next=rear;
    if(front==NULL)
        front=t;
    rear=t;
    elements++;

}

void  Queue::show() const{

    Node *p=rear;
    for(; p->next!=rear; p=p->next){
        cout<<" "<<p->data;
    }
    cout<<"\n";
}
int main(){
    Queue obj;
    obj.add("I");
    obj.add("Am");
    obj.add("Super");
    obj.add("Cool");
    obj.show();
}

3 个答案:

答案 0 :(得分:1)

目前它既不是FIFO也不是FILO bu JINO(只是在,从不出局)。

你要做的是插入后端。并且你的节目会从后向前迭代,因为这是唯一的联系方向。

对于有效的FIFO,您需要从队列的前端删除。你会注意到,你可以找到前面的元素,但你没有简单的方法来找到设置前指针所需的第二个元素。这是单链接设计的缺点,你必须从后面到前面迭代才能找到指向前面的元素。

  • 使用单个链接列表,您可以执行FILO(实际上更有可能命名为LIFO或堆栈)
  • 对于FIFO,双链表将是更好的设计。

如果你想坚持一个链表,你可以做一些递归。你消除了前指针,因为它没用。

void  Queue::show_one(Node *p) const{
    if (p->next!=rear) {    // i kept the test for p->next!=rear
                            // either fix add or test for p->next!=NULL
        show_one(p->next);
    }
    cout<<" "<<p->data;
}

void  Queue::show() const{
    show_one(rear);
    cout<<"\n";
}

同样你可以写一个remove()

答案 1 :(得分:0)

实现,FILO(像STACK?), 当推(添加)时,在末尾附加你的新元素(你将处理后指针) 弹出时,去除后指针指向的元素。

在你的代码中,你的后指针指向结束后的一个元素,它是null。所以push需要O(n),并且还需要花费O(n)。它效率不高。所以考虑双链表可能是更容易实现的更好选择。

答案 2 :(得分:0)

我想出了如何扭转整个事情,以便它现在正常工作。它有效吗?运行main需要1.06ms。

    #include <iostream>
    #include <string>
    using namespace std;
    bool die(const string &msg);

    class Queue{
        public:
            Queue();
           ~Queue();
           void add(const string & item);
           string remove();
           unsigned items() const;
           void show() const;
        private:
            struct Node{
                string data;
                Node *next;
            };
            Node *rear;
            Node *front;
            unsigned elements;
    };

    Queue::Queue():elements(0),rear(NULL),front(NULL){}

    Queue::~Queue(){
     unsigned el=items();
     for(unsigned i=0; i<el; i++)
      remove();
    }
    unsigned Queue::items()const{
        return elements;
    }

    string Queue::remove(){
        if(front==NULL) die("underflow");
        Node *t=front;
        string data=t->data;
        front=t->next;
        delete t;
        elements--;
        return data;
    }
    void Queue::add(const string &item){
     Node *t=new Node;
     t->data=item;
     t->next=NULL;
     if(front==NULL)
        front=t;
     else{
        Node *t2=rear;
        t2->next=t;
     }
     rear=t;
     elements++;
    }

    void  Queue::show() const{
        Node *t=front;
        for(unsigned i=0; i<items(); i++, t=t->next)
            cout<<t->data<<'\n';
    }

    bool die(const string &msg){
        cout<<"Error: "<<msg;
        exit(EXIT_FAILURE);
    }

    int main(){
        Queue obj;
        obj.show();
        obj.add("poo");
        obj.add("cra");
        obj.add("bil");
        obj.add("shi");
        obj.show();
        cout<<obj.remove()<<"\n";
        cout<<obj.remove()<<"\n";
        cout<<obj.remove()<<"\n";
        cout<<obj.remove()<<"\n";
    }