1

所以我正在尝试创建一个单链表队列。我正在尝试编写一个添加元素的函数,一切都很好,但问题是它的 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();
}
4

3 回答 3

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()

于 2012-12-09T01:13:44.910 回答
0

实现,FILO(像STACK?),当push(add)时,将你的新元素追加到末尾(你将处理后指针)当pop时,摆脱后指针指向的元素。

在您的代码中,您的后指针指向结束后的一个元素,该元素为空。所以 push 需要 O(n),pop 需要 O(n)。它效率不高。所以考虑双链表可能是更容易实现的更好选择。

于 2012-12-09T01:35:41.383 回答
0

我想出了如何扭转整个事情,所以它现在可以正常工作。它有效率吗?运行 main 花了 1.06 毫秒。

    #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";
    }
于 2012-12-09T03:00:14.067 回答