#include <stdio.h>
#include <malloc.h>
#define MAXQSIZE 10 //最大队列长度,实际使用MAXQSIZE-1
typedef int ElemType;
//1.循环队列(☆☆☆☆少用一个存储单元☆☆☆☆☆)
typedef struct
{
//--------补充代码--Start------
ElemType *base ;
int front,rear ;
//--------补充代码--End-------
}SqQueue;
//函数声明
void PrintQueue(SqQueue &Q);
int InitQueue(SqQueue &Q);
int QueueEmpty(SqQueue &Q);
int QueueLength(SqQueue &Q);
int GetHead(SqQueue &Q,ElemType &e);
int EnQueue(SqQueue &Q,ElemType e);
int DeQueue(SqQueue &Q,ElemType &e);
//2.输出队列中元素值,从头到尾
void PrintQueue(SqQueue &Q)
{
int p=Q.front;
//判断队列是否为空
if(!QueueEmpty(Q))
{
while(p!=Q.rear)
{
printf("%d\n",Q.base[p]);
p = (p+1)%MAXQSIZE;
}
}
}
//3.构造一个空队列Q,分配空间并做初始化,成功返回1,否则返回0
int InitQueue(SqQueue &Q)
{
//--------补充代码--Start------
Q.base=(ElemType*)malloc(MAXQSIZE*sizeof(ElemType));
if (!Q.base)
{
return 0;
}
Q.front=0;
Q.rear=0;
return 1;
}
//--------补充代码--End-------
//队列判空,若队列Q为空队列,则返回1,否则返回0
int QueueEmpty(SqQueue &Q)
{
//--------补充代码--Start------
if(Q.front == Q.rear)
return 1;
else
return 0;
//--------补充代码--End-------
}
//求队列的长度
int QueueLength(SqQueue &Q)
{
/*返回Q元素的个数,即队列的长度*/
int i;
i=(Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
return(i);
}
//求队头元素值,若队列不为空,则用e返回Q的队头元素,并返回1;否则返回0
int GetHead(SqQueue &Q,ElemType &e)
{
//--------补充代码--Start------
if (Q.front == Q.rear) {
return 0;
}
e = Q.base[Q.front];
return 1;
//--------补充代码--End-------
}
//插入元素e作为Q的新的队尾元素,队满则返回0,否则返回1
int EnQueue(SqQueue &Q,ElemType e)
{
if ((Q.rear+1)%MAXQSIZE==Q.front)
return 0;
//--------补充代码--Start------
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXQSIZE;
//--------补充代码--End-------
printf("%d\n", e);
return 1;
}
//若队列不空,则删除Q的队头元素,用e返回其值,并返回1,否则返回0
int DeQueue(SqQueue &Q,ElemType &e)
{
//--------补充代码--Start------
if (Q.front==Q.rear)//队列空
return 0;
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXQSIZE;
printf("%d\n", e);
return 1;
}
//主函数
int main( )
{
SqQueue Q;
int select;
ElemType e;
//初始化队列,如果无法分配程序退出
if ((InitQueue(Q))==0)
return 0;
//处理输入输出
while(scanf("%d",&select)!=EOF)
{
//程序结束
if(select==-1)
return 0;
//输出元素
else if(select==0)
PrintQueue(Q);
//进队
else if(select==1)
{
//--------补充代码--Start------
scanf("%d", &e);
if((EnQueue(Q, e))==0)
{
printf("-1");}
//--------补充代码--End-------
//出队
}
else if(select==2)
{
//--------补充代码--Start------
ElemType e;int flag;
if(DeQueue(Q,e))
{
printf("-1");
}
}
//--------补充代码--End-------
//求队头
else if(select==3)
{
if(GetHead(Q,e)==0)
printf("-1\n");
else
printf("%d\n",e);
}
//求队列长度
else if(select==4)
printf("%d\n",QueueLength(Q));
//判断队空
else if(select==5)
printf("%d\n",QueueEmpty(Q));
}
return 0;
}