通过顺序表存储队列。
当入队时队尾指针+1,出队时队头指针也+1。
通过取余运算使队头指针和队尾指针在顺序表的表头和表尾移动以实现循环。
当队为空队时候,队头指针和队尾指针都指向同一个位置。当队非空的时候队尾指针指向队尾元素的下一位。那么若队满的时候,队尾指针又和队头指针同时指向同一个位置。若不做处理,则队空和队满的时候都会出现Q->front == Q->rear成立。逻辑上就不能判断是队满还是队空。解决这个问题有两种方案,一是设置一个标志位标记是队满还是队空。二是牺牲最后一个存储位置。当队尾指针指向队头指针前一个位置时就认为队满。
下面以第二种解决方案实现循环队列,请看代码。
#include<stdio.h>
#define MAXQSIZE 20
struct SqQueue
{
int *base;
int front;
int rear;
};
int InitQueue(struct SqQueue *Q)//创建空队
{
Q->base = (int *)malloc(MAXQSIZE * sizeof(int));
if(!Q->base)
return 0;
Q->front = Q->rear= 0;
return 1;
}
int EnQueue(struct SqQueue *Q, int e)//进队
{
if((Q->rear +1)%MAXQSIZE == Q->front)
return 0;
Q->base[Q->rear] = e;
Q->rear= (Q->rear+1)%MAXQSIZE;
return 1;
}
int QueueLength(struct SqQueue *Q)//得到队的长度
{
return (Q->rear -Q->front+MAXQSIZE)%MAXQSIZE;
}
int DeQueue(struct SqQueue *Q)//出队
{
if(Q->front == Q->rear)
return 0;
int e = Q->base[Q->front];
Q->front = (Q->front+1)% MAXQSIZE;
return e;
}
int main()
{
struct SqQueue Q;
InitQueue(&Q);
int e ;
scanf("%d",&e);
EnQueue(&Q,e);
int j = QueueLength(&Q);
printf("队的长度:\n%d\n",j);
int i = DeQueue(&Q);
printf("出队结果\n");
printf("\n%d\n",i);
return 0;
}