所以我正在尝试创建一个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();
}
答案 0 :(得分:1)
目前它既不是FIFO也不是FILO bu JINO(只是在,从不出局)。
你要做的是插入后端。并且你的节目会从后向前迭代,因为这是唯一的联系方向。
对于有效的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";
}