原题:试采用一维数组实现循环的双端队列,即可以在任意一端入队列与出队列,并实现以下公操作:初始化、判空、求元素个数、入队列与出队列。分析:用tag(=1、2)来标识对哪一端操作,tag==1时对front端操作,tag==2时对rear端操作。
#include<iostream.h>
#include<stdlib.h>
typedef enum{FALSE,TRUE,OK,ERROR,OVER_FLOW}Status;
#define MAXSIZE 100 //存储空间最大容量
#define ElemType char
typedef struct
{
ElemType elem[MAXSIZE]; //队列空间
int front; //队头
int rear; //队尾
}DuQueue;
void InitQueue(DuQueue &Q)
{//构造一个空的双端队列
Q.front=Q.rear=0;
}
Status QueueEmpty(DuQueue Q)
{//判空函数,为空返回TRUE,否则返回FALSE
if(Q.front == Q.rear)
{
cout<<"当前队列为空!"<<endl;
return TRUE; //Q.front==Q.rear时表示队列为空,返回true
}
else
{
cout<<"当前队列非空!"<<endl;
return FALSE; //否则返回false
}
}
int QueueLength(DuQueue Q,int &length)
{//返回队列Q的元素个数
length=(Q.rear-Q.front+MAXSIZE)%MAXSIZE;
cout<<"当前队列长度为:"<<length<<endl;
return length;
}
Status EnQueue(DuQueue &Q,ElemType e,int tag)
{//插入元素e到队列中,tag==1时插入到front端,否则插入到rear端
if((Q.rear+1)%MAXSIZE == Q.front)
return OVER_FLOW; //队列已满,返回OVER_FLOW
if((Q.front-1)%MAXSIZE == Q.rear)
return OVER_FLOW; //队列已满,返回OVER_FLOW
else if(tag == 1)
{//在front端插入
Q.front=(Q.front-1+MAXSIZE)%MAXSIZE;
Q.elem[Q.front]=e; //Q.front指向队头元素
return OK; //插入成功
}
else if(tag == 2)
{//在rear端插入
Q.elem[Q.rear]=e; //Q.rear指向虚单元
Q.rear=(Q.rear+1)%MAXSIZE;
return OK; //插入成功
}
else
return ERROR; //tag非法,返回ERROR
}
Status DeQueue(DuQueue &Q,ElemType &e,int tag)
{//队列非空时出队列,tag==1时删除front端元素,tag==2时删除rear端元素,并用e返回其值
if(QueueEmpty(Q)==TRUE)
return ERROR; //队列为空,返回ERROR
else if(tag == 1)
{//在front端出队
e=Q.elem[Q.front];
Q.front=(Q.front+1)%MAXSIZE;
return OK; //出队成功
}
else if(tag == 2)
{//在rear端出队
Q.rear=(Q.rear-1+MAXSIZE)%MAXSIZE;
e=Q.elem[Q.rear];
return OK; //出队成功
}
else
return ERROR; //tag值非法,返回ERROR
}
Status DisplayDeQueue(DuQueue Q)
{//从队头到队尾逐个输出队列中的元素
if(QueueEmpty(Q)==TRUE)
{
cout<<"当前队列为空!"<<endl;return ERROR;
}
while(Q.front!=Q.rear)
{
cout<<Q.elem[Q.front]<<" ";
Q.front=(Q.front+1)%MAXSIZE;
}
cout<<endl;
return OK;
}
void main()
{
DuQueue Q;
InitQueue(Q);
int length;
for(int i=0;i<10;i++)
{//生成随机字母并将其入队列
int flag=1;
char e=rand()%26+'a';
if(flag==rand()%2)
EnQueue(Q,e,1);
else
EnQueue(Q,e,2);
}
DisplayDeQueue(Q);
QueueLength(Q,length);
}