C++ STL 隊列容器的遍歷輸出方法

通常情況下我們可以使用自己寫好的類模板來實現鏈隊列:

/**********************************鏈隊列的實現********************************/
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();
	}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章