由于Q.real=Q.front无法判别队列是“空”还是“满”,此处条件设置为:少用一个元素空间,约定以“队头指针在队尾指针的下一位置上”作为队列呈'“满”状态的标志
#include<iostream>
using namespace std;
//-----------------循环队列——队列的顺序存储结构-----------------
#define ok 1
#define error 0
#define COUNT 5
#define MAXQSIZE 6//最大队列长度
typedef int QElemType;
typedef int Status;
typedef struct
{
QElemType *base;//初始化的动态分配存储空间
int front;//对头指针
int rear;//队尾指针
}SqQueue;
//----------------基本操作的函数原型说明-------------------
class QueueOperation{
public:
Status InitQueue(SqQueue &Q);//构造一个空队列Q
Status DestroyQueue(SqQueue &Q);//销毁队列Q,Q不在
Status ClearQueue(SqQueue &Q);//将Q清为空队列
Status QueueEmpty(SqQueue Q);//若队列Q为空队列,则返回true,否则返回false
int QueueLength(SqQueue Q);//返回Q的元素个数,即为队列的长度
Status GetHead(SqQueue Q,QElemType &e);//用e返回Q的队头元素
Status EnQueue(SqQueue &Q,QElemType e);//插入元素e为Q的新队尾元素
Status DeQueue(SqQueue &Q,QElemType &e);//删除Q的对头元素,用e返回其值
Status QueueTraverse(SqQueue Q,Status (*visit)(QElemType));//用visit()遍历队列Q
};//QueueOperation
Status QueueOperation::InitQueue(SqQueue &Q)
{
Q.base=new QElemType[MAXQSIZE];
if(!Q.base)
{
cout<<"存储失败"<<endl;
exit(-1);
}//if
Q.front=0;
Q.rear=0;
return ok;
}//InitQueue
Status QueueOperation::DestroyQueue(SqQueue &Q)
{
delete Q.base;
Q.base=NULL;
return ok;
}//DestroyQueue
Status QueueOperation::ClearQueue(SqQueue &Q)
{
Q.front=0;
Q.rear=0;
return ok;
}//ClearQueue
Status QueueOperation::QueueEmpty(SqQueue Q)
{
if(Q.rear==Q.front)
return true;
else
return error;
}//QueueEmpty
int QueueOperation::QueueLength(SqQueue Q)
{
return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
}//QueueLength
Status QueueOperation::GetHead(SqQueue Q,QElemType &e)
{
e=Q.base[Q.front];
return ok;
}//GetHead
Status QueueOperation::EnQueue(SqQueue &Q,QElemType e)
{
if((Q.rear+1)%MAXQSIZE==Q.front)//队满
{
cout<<"队列Q已满,不能继续添加"<<endl;
return error;
}//if
Q.base[Q.rear]=e;//队尾添加元素
Q.rear=(Q.rear+1)%MAXQSIZE;
return ok;
}//EnQueue
Status QueueOperation::DeQueue(SqQueue &Q,QElemType &e)
{
if(Q.rear==Q.front)
{
cout<<"队列Q为空"<<endl;
return error;
}//if
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXQSIZE;
return ok;
}//DeQueue
Status visit(QElemType e)
{
cout<<e<<endl;
return ok;
}//visit
Status QueueOperation::QueueTraverse(SqQueue Q,Status (*visit)(QElemType))
{
while(Q.front!=Q.rear)
{
visit(Q.base[Q.front]);
Q.front=(Q.front+1)%MAXQSIZE;
}//while
return ok;
}//QueueTraverse
void main()
{
QueueOperation QOP;
SqQueue Q;
QElemType e;
QOP.InitQueue(Q);
Status (*vis)(QElemType);
vis=visit;
for(int i=1;i<=COUNT;i++)
{
QOP.EnQueue(Q,i);
}//for
cout<<"输出队列Q中的元素:"<<endl;
QOP.QueueTraverse(Q,vis);
cout<<"队列Q的长度Length= ";cout<<QOP.QueueLength(Q)<<endl;
cout<<"队列Q的队头元素:";
QOP.GetHead(Q,e);cout<<e<<endl;
cout<<"删除队列Q的对头元素,Q中剩余元素:"<<endl;
QOP.DeQueue(Q,e);
QOP.QueueTraverse(Q,vis);
cout<<"添加一个新的元素,队列Q中元素:"<<endl;
QOP.EnQueue(Q,6);
QOP.QueueTraverse(Q,vis);
cout<<"继续向队列Q中添加元素:"<<endl;
QOP.EnQueue(Q,7);
cout<<"销毁队列Q:成功/失败(1/0):"<<QOP.DestroyQueue(Q)<<endl;
}//main