通常情況下我們可以使用自己寫好的類模板來實現鏈隊列:
/**********************************鏈隊列的實現********************************/
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();
}