队列(C++模版类实现)

 - by Hector

[CODE=cplusplus]
/*//////////////////////////////////////////////////////////////////////////////

// 名 称 (Unit Name) : 队列 Queue.h 头文件

// 作 者 (Author) : Hector(张伟)

// 邮 箱 (E-mail) : ourys@qq.com

// 支 持 (Support) : http://www.ourys.com

// 备 注 (Remarks) :

//////////////////////////////////////////////////////////////////////////////*/

#ifndef _QUEUE_H

#define _QUEUE_H

#define QUEUE_INIT_SIZE 100 //初始队列的最大长度

#define QUEUEINCREMENT 10 //每次新增的长度

template

class Queue{

public:

Queue(); //构造函数,创建一个新的队列

bool EnQueue(DataType e); //插入一个值为e的队尾元素

bool GetHead(DataType &e); //取出队头元素

bool DeQueue(DataType &e); //删除队头元素

bool QueueEmpty(); //判断是否非空

bool Clear(); //清空队列

~Queue(); //销毁队列

private:

DataType *front;

DataType *rear;

int queuesize;

};

/*———— 构造函数,创建一个新的队列 ————–*/

template

Queue::Queue()

{

if(!(front=(DataType*)malloc(QUEUE_INIT_SIZE*sizeof(DataType)))) exit(1);

rear=front;

queuesize=QUEUE_INIT_SIZE;

}

/*———— 插入一个值为e的队尾元素 ————–*/

template

bool Queue::EnQueue(DataType e)

{

if(rear-front>=queuesize){

if(!(front=(DataType*)realloc(front,(queuesize+QUEUEINCREMENT)*sizeof(DataType)))) exit(1);

rear=front+queuesize;

queuesize+=QUEUEINCREMENT;

}

*rear++=e;

return true;

}

/*———— 取出队头元素 ————–*/

template

bool Queue::GetHead(DataType &e)

{

if(rear==front) return false;

e=*front;

return true;

}

/*———— 删除队头元素 ————–*/

template

bool Queue::DeQueue(DataType &e)

{

if(rear==front) return false;

e=*front;

DataType* temp;

temp=front;

while(temp!=rear) //为了删除后的空间继续利用,所有元素都向前移一位

{

*temp=*(temp+1);

temp++;

}

rear–;

return true;

}

/*———— 判断是否非空 ————–*/
template
bool Queue::QueueEmpty()
{
return rear==front? 1:0;
}

/*———— 清空队列 ————–*/
template
bool Queue::Clear()
{
rear=front;
return true;
}

/*———— 销毁队列 ————–*/

template

Queue::~Queue()

{

free(front);

}

#endif



/*—————- 基本测试文件 ——- Author:Hector ——-*/

#include
#include “Queue.h”
using namespace std;
int main()
{
Queue my;
int temp;
for(int i=2;i<10;i++)
{
my.EnQueue(i);
my.GetHead(temp);
cout< }
for(int i=2;i<10;i++)
{
my.DeQueue(temp);
cout< }
my.DestroyQueue();
return 0;
}
[/CODE]

Leave a comment