【C++】模拟实现队列

一、队列简介

队列是一种只允许在一段进行插入,另外一段进行删除的特殊线性表,允许删除操作的一端称为队头,允许插入操作的一端称为队尾

队列又被称为先进先出的线性表。

与栈类似,队列也有两种存储结构,一种是顺序存储,一种是链式存储,前面一种称为顺序队列,后面一种称为链队。

此处要注意顺序队列的溢出现象:

(1)“下溢”现象:当队列为空时,做出队列的运算产生的溢出现象。(“下溢”是正常现象,常作为程序的控制转移条件)

(2)“真上溢”现象:当队列为满时,做进队列运算产生的空间溢出现象。

(3)“假上溢”现象:由于入队列和出队列并不是元素向前移动,而是指针在移动阿德,我们向队列里删除一个元素,加入一个元素,两个指针会不断的向前移动,直至队列所在的向量空间的尾部,这时再入队列,尾指针就跑到向量空间外面,尽管向量空间为空,队列也为空,却还是产生了溢出的现象,这便是“假溢出”现象。

注意:针对假溢出现象,我们便采用循环队列的方法处理这样的情况。

二、队列支持的操作 

(1)队列初始化(InitQueue)

(2)入队操作(PushQueue)

(3)出队操作(PopQueue)

(4)读取队头元素(FrontQueue)

(5)判断队列是否为空(EmptyQueue)

三、队列的实现

#include 
#include 
using namespace std;
template 
struct QueueNode
{
	T _data;
	QueueNode* _next;
	QueueNode(const T& data)
		:_data(data)
		,_next(next)
	{}
};
template 
class Queue
{
	typedef QueueNode 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;
};



你可能感兴趣的:(数据结构)