一,队列的基本概念
队列特性:先进先出(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