顺序存储的假溢出
对于一个数组,由于每出队一个元素,队头指针front就会向前移动一个位置,当front移到某个位置时如果再进行入队操作的话(可以进行多次入队操作),就会发现数组后面的位置已满,而数组前面的位置却是空的情况,这种现象就叫做假溢出。
循环队列
队列初始为空时:使front=rear,front指向当前队头元素,rear指向队尾元素的下一个位置
这会造成一个问题:当队满的时候front也等于rear,这会导致无法判断是空还是满。
解决方案1
加一个flag标志,flag=rear且flag为0时----->队空
flag=rear且flag为1时----->队满
解决方案2
保留一个元素空间
队空:front=rear
队满:(rear+1)%maxsize==front
队长:(rear-front+maxsize)%maxsize
#include <stdio.h>
#include <stdlib.h>
typedef int Elemtype;
#define maxsize 11//其实只能存放10个
typedef struct {
Elemtype data[maxsize];
int front;//头指针
int rear;//尾指针
}Queue;
void Init(Queue **Q)
{
*Q=(Queue*)malloc(sizeof(Queue));
(*Q)->front=0;
(*Q)->rear=0;
}
int EnQueue(Queue *Q,Elemtype e)
{
if((Q->rear+1)%maxsize==Q->front)
{
printf("队列已满\n");
return 0;
}
Q->data[Q->rear]=e;
Q->rear=(Q->rear+1)%maxsize;
return 1;
}
int DeQueue(Queue *Q,Elemtype *e)
{
if(Q->rear==Q->front)
{
printf("队列已空\n");
return 0;
}
*e=Q->data[Q->front];
Q->front=(Q->front+1)%maxsize;
return 1;
}
int main()
{ Queue *Q;
Init(&Q);
for(int i=0;i<=10;i++)
{
EnQueue(Q,i);
}
for(int i=0;i<=10;i++)
{
int *x;
DeQueue(Q,&x);
printf("Q->data=%d\n",Q->data[i]);
}
return 0;
}