1. 程式人生 > >佇列(C++模板實現)

佇列(C++模板實現)

一,佇列的基本概念

佇列特性:先進先出(FIFO)——先進佇列的元素先出佇列。來源於我們生活中的佇列(先排隊的先辦完事)。

佇列有下面幾個操作:

  • 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)測試結果:

參考資源:

【1】《演算法導論》

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

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