#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 20
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef int QElemType;
typedef struct SqQueue
{
QElemType data[MAXSIZE];
int front;
int rear;
}SqQueue;
Status InitQueue(SqQueue *q)
{
q->front=0;
q->rear=0;
return OK;
}
Status QueueEmpty(SqQueue q)
{
if(q.front==q.rear)
return TRUE;
else
return FALSE;
}
Status EnQueue(SqQueue *q,QElemType e)
{
if((q->rear-q->front+MAXSIZE)%MAXSIZE==MAXSIZE-1)
return ERROR;
/*if((q->rear+1)%MAXSIZE==q->front)
return ERROR;*/
/*q->front=(q->front-1)%MAXSIZE;
q->data[q->front]=e;*///错误,插入是在队尾
q->data[q->rear]=e;
q->rear=(q->rear+1)%MAXSIZE;
return OK;
}
Status QueueLength(SqQueue q)
{
return (q.rear-q.front+MAXSIZE)%MAXSIZE;
//return (q.rear-q.front+1)%MAXSIZE;//错误
}
Status DeQueue(SqQueue *q,QElemType *e)
{
if(q->front==q->rear)
return ERROR;
*e=q->data[q->front];
q->front=(q->front+1)%MAXSIZE;
return OK;
}
Status visit(QElemType e)
{
printf("%d ",e);
return OK;
}
/* 从队头到队尾依次对队列Q中每个元素输出 */
//Status QueueTraverse(SqQueue Q)
//{
// int i;
// i=Q.front;
// while((i+Q.front)!=Q.rear)
// {
// visit(Q.data[i]);
// i=(i+1)%MAXSIZE;
// }
// printf("\n");
// return OK;
//}
Status QueueTraverse(SqQueue q)
{
/*while(q.front!=q.rear)
{
visit(q.data[q.front]);
}*///错误
int i=q.front;
while(i!=q.rear)
{
visit(q.data[i]);
i=(i+1)%MAXSIZE;
}
printf("\n");
return OK;
}
Status GetHead(SqQueue q,QElemType *e)
{
if(q.rear==q.front)
return ERROR;
else
*e=q.data[q.front];
return OK;
}
Status ClearQueue(SqQueue *q)
{
q->front=q->rear=0;
return OK;
}
int main()
{
Status j;
int i=0,l;
QElemType d;
SqQueue Q;
InitQueue(&Q);
printf("初始化队列后,队列空否?%u(1:空 0:否)\n",QueueEmpty(Q));
printf("请输入整型队列元素(不超过%d个),-1为提前结束符: ",MAXSIZE-1);
do
{
/* scanf("%d",&d); */
d=i+100;
if(d==-1)
break;
i++;
EnQueue(&Q,d);
}while(i<MAXSIZE-1);
printf("队列长度为: %d\n",QueueLength(Q));
printf("现在队列空否?%u(1:空 0:否)\n",QueueEmpty(Q));
printf("连续%d次由队头删除元素,队尾插入元素:\n",MAXSIZE);
for(l=1;l<=MAXSIZE;l++)
{
DeQueue(&Q,&d);
printf("删除的元素是%d,插入的元素:%d \n",d,l+1000);
/* scanf("%d",&d); */
d=l+1000;
EnQueue(&Q,d);
}
l=QueueLength(Q);
printf("现在队列中的元素为: \n");
QueueTraverse(Q);
printf("共向队尾插入了%d个元素\n",i+MAXSIZE);
if(l-2>0)
printf("现在由队头删除%d个元素:\n",l-2);
while(QueueLength(Q)>2)
{
DeQueue(&Q,&d);
printf("删除的元素值为%d\n",d);
}
j=GetHead(Q,&d);
if(j)
printf("现在队头元素为: %d\n",d);
ClearQueue(&Q);
printf("清空队列后, 队列空否?%u(1:空 0:否)\n",QueueEmpty(Q));
system("pause");
return 0;
}
运行结果: