1. 程式人生 > >【C++】模擬實現佇列

【C++】模擬實現佇列

一、佇列簡介

佇列是一種只允許在一段進行插入,另外一段進行刪除的特殊線性表,允許刪除操作的一端稱為隊頭,允許插入操作的一端稱為隊尾

佇列又被稱為先進先出的線性表。

與棧類似,佇列也有兩種儲存結構,一種是順序儲存,一種是鏈式儲存,前面一種稱為順序佇列,後面一種稱為鏈隊。

此處要注意順序佇列的溢位現象:

(1)“下溢”現象:當佇列為空時,做出佇列的運算產生的溢位現象。(“下溢”是正常現象,常作為程式的控制轉移條件)

(2)“真上溢”現象:當佇列為滿時,做進佇列運算產生的空間溢位現象。

(3)“假上溢”現象:由於入佇列和出佇列並不是元素向前移動,而是指標在移動阿德,我們向佇列裡刪除一個元素,加入一個元素,兩個指標會不斷的向前移動,直至佇列所在的向量空間的尾部,這時再入佇列,尾指標就跑到向量空間外面,儘管向量空間為空,佇列也為空,卻還是產生了溢位的現象,這便是“假溢位”現象。

注意:針對假溢位現象,我們便採用迴圈佇列的方法處理這樣的情況。

二、佇列支援的操作 

(1)佇列初始化(InitQueue)

(2)入隊操作(PushQueue)

(3)出隊操作(PopQueue)

(4)讀取隊頭元素(FrontQueue)

(5)判斷佇列是否為空(EmptyQueue)

三、佇列的實現

#include <iostream>
#include <assert.h>
using namespace std;
template <class T>
struct QueueNode
{
	T _data;
	QueueNode<T>* _next;
	QueueNode(const T& data)
		:_data(data)
		,_next(next)
	{}
};
template <class T>
class Queue
{
	typedef QueueNode<T> Node;
public:

	Queue()
		:_Front(NULL)
		,_Real(NULL)
	{}
	~Queue()
	{
		Node* cur = _Front;
		while (cur)
		{
			Node* del = cur;
			cur = cur->_next;
			delete cur;
		}
	}
	void Push(const T& data)
	{
		if (_Front != NULL)
		{
			Node temp = new Node(data);
			_Real->_next = temp;
			_Real = _Real->_next;
		}
		else
		{
			_Front = new Node(data);
			_Real = _Front;
		}
	}
	bool Pop()
	{
		if (Empty())
		{
			cout << "Queue is empty!!!" << endl;
			return false;
		}
		else
		{
			Node* del = _Front;
			_Front = _Front->_next;
			delete del;
			del = NULL;
		}
	}
	bool Empty()
	{
		if (_Front == NULL)
			return true;
		return false;
	}
	T& FrontQueue()
	{
		assert(_Front != NULL);
		return _Front->_data;
	}
private:
	Node* _Front;
	Node* _Real;
};