队列常常也使用链式存储的方式来实现。为了方便操作,同顺序存储一样,我们要维护一个头指针和一个尾指针。如下图:
在链式队列中显然不会出现假溢出的情况。但在出队时,要及时释放内存。由于在队列的实现:顺序队列中,对队列的描述已经很清楚了。就闲话不多说,直接上代码:
类定义和类实现
#include<iostream> #include<iomanip> using namespace std; typedef int ELemType; class QNode //节点类型 { public: ELemType data; QNode *next; QNode(ELemType v, QNode*p=NULL):data(v),next(p){}; }; class LinkQueue //链式队列 { private: int size; QNode *front; //头指针 QNode *rear; //尾指针 public: LinkQueue(); //默认构造方法 ~LinkQueue(); //析构 int getSize(); //链表大小 bool getFront(ELemType&); //获取头节点 bool getRear(ELemType&); //获取尾节点 bool empty(); //队列是否为空 void clear(); //清空链表 void enQueue(ELemType); //入队 void deQueue(); //出队 void queueTraverse(); //队列遍历 }; //类实现 LinkQueue::LinkQueue() { front=rear=NULL; size=0; } LinkQueue::~LinkQueue() { clear(); } int LinkQueue::getSize() { return size; } bool LinkQueue::getFront(ELemType &item) { if(front) { item=front->data; return true; } cout<<"空队列!"<<endl; return false; } bool LinkQueue::getRear(ELemType &item) { if(rear) { item=rear->data; return true; } cout<<"空队列!"<<endl; return false; } bool LinkQueue::empty() { return size==0; } void LinkQueue::clear() { if(front) { QNode *q,*p=front; while(p) { q=p->next; delete p; p=q; } } rear=NULL; //这一句,不能忘了 size=0; } void LinkQueue::enQueue(ELemType data) { if(front) { rear->next=new QNode(data,NULL); rear=rear->next; } else { front=rear=new QNode(data,NULL); } size++; } void LinkQueue::deQueue() { if(front) { QNode* p=front; front=front->next; delete p; size--; } } void LinkQueue::queueTraverse() { if(front) { QNode *p=front; while(p) { cout<<setw(4)<<p->data; p=p->next; } cout<<endl; } else cout<<"队列为空!"<<endl; }主函数
int main() { cout<<"链式队列演示"<<endl; LinkQueue queue; ELemType item; cout<<"入队,输入0结束:"; while(cin>>item && item) queue.enQueue(item); cout<<"遍历"<<endl; queue.queueTraverse(); if(queue.getFront(item)) cout<<"获取队头元素:"<<item<<endl; if(queue.getRear(item)) cout<<"获取队尾元素:"<<item<<endl; cout<<"队头出队!"<<endl; queue.deQueue(); cout<<"遍历"<<endl; queue.queueTraverse(); queue.clear(); cout<<"清空队列后,是否为空:"; if(queue.empty()) cout<<"Yes!"<<endl; else cout<<"No!"<<endl; system("pause"); return 0; }运行:
完整代码下载:队列的实现:链式队列
原文:http://blog.csdn.net/zhangxiangdavaid/article/details/29597785