队列常常也使用链式存储的方式来实现。为了方便操作,同顺序存储一样,我们要维护一个头指针和一个尾指针。如下图:
在链式队列中显然不会出现假溢出的情况。但在出队时,要及时释放内存。由于在队列的实现:顺序队列中,对队列的描述已经很清楚了。就闲话不多说,直接上代码:
类定义和类实现
#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