队列(C++模板实现)

一,队列的基本概念

队列特性:先进先出(FIFO)——先进队列的元素先出队列。来源于我们生活中的队列(先排队的先办完事)。

<C/C++数据结构>队列(C++模板实现)_第1张图片

队列有下面几个操作:

  • InitQueue()   ——初始化队列
  • EnQueue()        ——进队列
  • DeQueue()        ——出队列
  • IsQueueEmpty()——判断队列是否为空
  • IsQueueFull()    ——判断队列是否已满

队列可以由数组和链表两种形式实现队列操作(c语言),下面仅以数组为例:




二,队列的数组实现

(1)Queue.h中的代码如下:

<pre name="code" class="html">#include "stdafx.h"
#include "iostream"
using namespace std;

template<class DataType>
class Queue
{
public:
	Queue(int size)
	{
		maxSize=size;
		front=0;
		rear=0;
		count=0;
		elements=NULL;
		elements = new DataType[size];//分配内存
		if (elements == NULL)
		{
			exit(1);
		}else
		{
			for (int i = 0; i < size; i++)
			{
				elements[i]=0;
			}
		}
	}
	~Queue()
	{
		//delete[] elements;
		destroyQueue();
	}
	//队列中的数据个数
	int getNum()
	{
		return count;
	}

	//入队
	int insertData(DataType nData);
	//出队
	DataType outData();
	//队列空与否
	bool IsEmpty();
	//摧毁队列
	bool destroyQueue();
private:
	int maxSize;
	int count;//统计元素个数
	int front;//队首
	int rear;//队尾
	DataType *elements;
};

template <class DataType>
int Queue<DataType>::insertData(DataType nData)
{
	if (count >= maxSize)
	{
		cerr<<"分配的已使用完!请勿再添加数据"<<endl;
		exit(1);
	}
	else
	{
		elements[rear]=nData;
		rear++;
		count++;
		return 1;
	}
	return 0;
}

template<class DataType>
DataType Queue<DataType>::outData()
{
	if (count == 0)
	{
		cerr<<"数据已经删除完!请勿再删除数据"<<endl;
		exit(1);
	}
	else
	{
		DataType temp=NULL;
		temp=elements[front];
		front++;
		count--;
		return temp;
	}
}

template<class DataType>
bool Queue<DataType>::IsEmpty()
{
	if (count == 0)
	{
		return true;
	}else
	{
		return false;
	}
}

template <class DataType>
bool Queue<DataType>::destroyQueue()
{
	if (elements == NULL)
	{
		return false;
	}else
	{
		delete[] elements;
		elements=NULL;
		return true;
	}
}

 
 

(2)主测试代码如下:

<pre name="code" class="html">// ConsoleAppQueue.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "Queue.h"
#include "iostream"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	Queue<char> S(10);
	char src='A';
	for (int i = 0;i < 10; i++)
	{
		S.insertData(src++);
	}
	cout<<"当前队列元素个数为:"<<S.getNum()<<endl;
	cout<<"---------------------队列初始化已经完成-------------------"<<endl;

	cout<<"---------------------输出队列元素-------------------"<<endl;
	for (int i = 0;i < 10; i++)
	{
		cout<<S.outData()<<"  ";
	}
	cout<<endl;
	if (S.IsEmpty())
	{
		cout<<"队列已经空"<<endl;
	}
	else
	{
		cout<<"当前队列元素个数为:"<<S.getNum()<<endl;
	}
	system("pause");
	return 0;
}

 
 

(3)测试结果:

三,队列的链表实现

(1)Queue.h的代码如下:

#include "stdafx.h"
#include "iostream"
using namespace std;

template<class DataType> class Queue;
template <class DataType>
class LinkNode
{
public:

	LinkNode()
	{
		nData=0;
		next=NULL;
	}
	LinkNode(DataType newData)
	{
		nData=newData;
		next=NULL;
	}
	~LinkNode()
	{

	}

private:
	friend class Queue<DataType>;
	DataType nData;
	LinkNode<DataType> *next;
};

template<class DataType>
class Queue
{
public:
	Queue(int size)
	{
		front=new LinkNode<DataType>;
		rear=new LinkNode<DataType>;
		count=0;
		maxSize=size;
	}
	~Queue()
	{
		destroyQueue();
	}
	//获取队列中的元素个数
	int getNum()
	{
		return count;
	}

	//入队
	int insertNode(DataType nData);
	//出队
	bool delNode();
	//队列空与否
	bool IsEmpty();
	//摧毁队列
	void destroyQueue();
private:
	LinkNode<DataType> *front;
	LinkNode<DataType> *rear;
	int count;
	int maxSize;
};

template<class DataType>
bool Queue<DataType>::IsEmpty()
{
	if (count == 0)
	{
		return true;
	}
	else
	{
		return false;
	}
}

template<class DataType>
int Queue<DataType>::insertNode(DataType nData)
{
	LinkNode<DataType> *newNode= new LinkNode<DataType>(nData);
	if (newNode == NULL)
	{
		exit(1);
	}
	if (rear == NULL && front == NULL)
	{
		rear=newNode;
		front=newNode;
		count++;
		return 1;
	}else
	{
		LinkNode<DataType> *p=front;
		int step=1;
		while (step < count)
		{
			p=p->next;
			step++;
		} 
		p->next=newNode;
		rear=newNode;
		count++;
		return 1;
	}
	return 0;
}


//出队
template<class DataType>
bool Queue<DataType>::delNode()
{
	if (getNum() == 0)
	{
		exit(1);
	}else
	{//
		if (front !=NULL)
		{
			cout<<"出队元素为:"<<front->nData<<" ";
			LinkNode<DataType> *p=front;
			front=p->next;
			delete p;
			count--;
			return true;
		}else
		{
			cerr<<"错误!元素已经全部出队"<<endl;
			return false;
		}
	}
}

template<class DataType>
void Queue<DataType>::destroyQueue()
{
	int len=getNum();
	for (int i=0;i<len; i++)
	{
		if (getNum() == 0)
		{
			cout<<"队列已经空,请勿再操作"<<endl;
			break;
		}
		delNode();
	}
}


(2)主测试代码:

// ConsoleAppQueueList.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "Queue.h"
#include "iostream"
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	int nLen=10;
	Queue<char> S(nLen);
	char str='A';
	for (int i = 0;i < nLen;i++ )
	{
		S.insertNode(str++);
	}
	cout<<"当前队列中的元素个数为:"<<S.getNum()<<endl;
	cout<<"--------------------队列初始化已经完成--------------------"<<endl;

	for (int i=0;i<nLen; i++)
	{
		cout<<"第"<<i+1<<"次出队!"<<" ";
		if (S.getNum() == 0)
		{
			cout<<"队列已经空,请勿再操作"<<endl;
			break;
		}
		S.delNode();
		cout<<" ";
		cout<<"当前队列中的元素个数为:"<<S.getNum()<<endl;
	}
	system("pause");
	return 0;
}

(3)测试结果:



参考资源:

《算法导论》

http://www.cnblogs.com/kaituorensheng/archive/2013/02/28/2937865.html

http://blog.chinaunix.net/uid-26548237-id-3473528.html



你可能感兴趣的:(数据结构,算法,队列)