通常情况下我们可以使用自己写好的类模板来实现链队列:
/**********************************链队列的实现********************************/
template<class QElemType>
class LinkQueue;
template<class QElemType>
class QNode {
protected:
QElemType data;
QNode<QElemType> *next;
public:
friend class LinkQueue<QElemType>;
};
template<class QElemType>
class LinkQueue {
protected:
QNode<QElemType> *front;
QNode<QElemType> *rear;
public:
LinkQueue();
virtual ~LinkQueue();
Status EnQueue(QElemType e);
Status DeQueue(QElemType &e);
void PrintQueue();
int QueueLength();
Status QueueEmpty();
};
template<class QElemType>
LinkQueue<QElemType>::LinkQueue()
{
front = rear = new(nothrow)QNode<QElemType>;
if (!front)
exit(LOVERFLOW);
front->next = nullptr;
}
template<class QElemType>
LinkQueue<QElemType>::~LinkQueue()
{
while (front) {
rear = front->next;
delete front;
front = rear;
}
}
template<class QElemType>
Status LinkQueue<QElemType>::EnQueue(QElemType e)
{
QNode<QElemType> *p = new(nothrow)QNode<QElemType>;
if (!p)
return LOVERFLOW;
p->data = e;
p->next = nullptr;
rear->next = p;
rear = p;
return OK;
}
template<class QElemType>
Status LinkQueue<QElemType>::DeQueue(QElemType &e)
{
QNode<QElemType> *p;
if (front == rear)
return ERROR;
p = front->next;
e = p->data;
front->next = p->next;
if (rear == p)
rear = front;
delete p;
return OK;
}
template<class QElemType>
void LinkQueue<QElemType>::PrintQueue()
{
QNode<QElemType> *p = front->next;
while (p) {
cout << p->data << ' ';
p = p->next;
}
cout << endl;
}
template<class QElemType>
int LinkQueue<QElemType>::QueueLength()
{
int i = 0;
QNode<QElemType> *p = front->next;
while (p) {
i++;
p = p->next;
}
return i;
}
template<class QElemType>
Status LinkQueue<QElemType>::QueueEmpty()
{
if (front == rear)
return TRUE;
return FALSE;
}
然而,C++自带的STL队列容器,在代码量上有很大的优势,只要在代码开头加上
#include <queue>
便可以很方便的使用如下功能:
queue<int> q;
q.empty(); //当队列空时,返回true
q.pop(); //弹出队列第一个元素,注意!并不会返回被弹出元素的值
q.push(x); //将x接到队列的末尾
q.front(); //访问队首元素
q.back(); //访问队尾元素
q.size(); //访问队列中元素个数
因为队列容器不允许对q进行直接操作,那么应该如何进行队列的遍历输出呢? 我昨天在完成数据结构哈希表的过程中,就遇到了这样一个问题,后来发现只要先进行front操作,再把第一个元素pop,同时判断队列是否为empty,就能够实现这样的功能了。具体的实现方式如下:
while (!q.empty()) {
cout << q.front() << " ";
q.pop();
}