循环队列中,由于入队时尾指针向前追赶头指针;出队时头指针向前追赶尾指针,造成队空和队满时头尾指针均相等。因此,无法通过条件front==rear来判别队列是"空"还是"满"。
解决这一问题有两种方法
1.设置计数器判断
2.--队满时:(rear+1)%n==front,队空时front=rear
队的长度通用公式(rear-front+maxsize)%maxsize
推导过程: 当 rear>front 时 队长为:rear-front
当rear<front时(说明有循环)一段是maxszie-front 一段是rear-0;
循环队列的顺序存储结构
typedef struct
{
int date[maxsize];
int front; //头指针
int rear; // 尾指针,若队列不为空,指向队列的下一个元素
}sqqueue;
循环队列的初始化
int initqueue(sqqueue *q)
{
q->front=0;
q->rear=0;
return 1;
}
循环队列的长度
int queuelength(sqqueue q)
{
return (q.rear-q.front+maxsize)%maxsize;//通用的求队列长度的公式
}
循环队列的入队列操作
int enqueue(sqqueue *q,int e)
{
if((q->rear+1)%maxsize==q->front) //队列满的判断条件
return 0;
q->date[q->rear]=e;
q->rear=(q->rear+1)%maxsize;
}
循环队列的出队列操作
int dequeue(squeue *q,int *e)
{
if(q->front==q->rear)
return 0; //队列为空的判断条件
*e=q->date[q->front];
q->front=(q->front+1)%maxsize; //front向后移动一个位置,若到最后则转到数组的头部
}
自己写了个简单的小程序测试了一下队列的定义,很简单,就是实现输入与输出
#include <stdio.h>
#include <stdlib.h>
//队列的顺序存储结构
#define maxsize 1000
typedef struct
{
int date[maxsize];
int front; //头指针
int rear; // 尾指针,若队列不为空,指向队列的下一个元素
}sqqueue;
//循环队列的初始化
int initqueue(sqqueue *q)
{
q->front=0;
q->rear=0;
return 1;
}
int queuelength(sqqueue q)
{
return (q.rear-q.front+maxsize)%maxsize;//通用的求队列长度的公式
}
void enqueue(sqqueue *q,int e)
{
if((q->rear+1)%maxsize==q->front) //队列满的判断条件
exit(0);
q->date[q->rear]=e;
q->rear=(q->rear+1)%maxsize;
}
void dequeue(sqqueue *q,int *e)
{
if(q->front==q->rear)
exit (0); //队列为空的判断条件
*e=q->date[q->front];
q->front=(q->front+1)%maxsize; //front向后移动一个位置,若到最后则转到数组的头部
}
int main()
{
int x;
sqqueue q;
initqueue(&q);
scanf("%d",&x);
while(x!=10)//'\n'的ASCII码值为10
{
enqueue(&q,x);
scanf("%d",&x);
}
while(queuelength(q))
{
dequeue(&q,&x);
printf("%d\n",x);
}
printf("%d",queuelength(q));
return 0;
}