队列,先进先出 First In First Out
循环队列,Rear 和 Front 到达数组端点时,回到数组开始处。相当于将数组头尾相连,想象成环状。
Rear%数组长度可以折返到起始单元
当Front 和 Rear 值相等时,队列可能为空或者满
方法一:增设变量记录当前队列元素个数Size 或者用一个变量Flag记录最后一次操作是入队还是出队
方法二:少用一个元素空间,把图示状态就视为队满。此时的状态是队尾指针加1就会赶上队头指针。
队满条件 : (Rear+1)%数组长度=Front
队空条件 : Rear=Front
队列初始化,Front 和 Rear 都初始化为0
插入一个元素 Rear=(Rear+1)%数组长度
删除一个元素 Front=(Front+1)%数组长度
typedef int ElementType;
typedef int Position;
typedef struct QNode* PtrToQNode;
struct QNode
{
ElementType *Data; //存储元素的数组
Position Front,Rear; //队列的头尾指针
int MaxSize; //队列的最大容量
};
typedef PtrToQNode Queue;
//循环队列的创建
Queue CreateQueue(int MaxSize)
{
Queue Q=(Queue)malloc(sizeof(struct QNode));
Q->Data=(ElementType *)malloc(MaxSize*sizeof(ElementType));
Q->Front=Q->Rear=0;
Q->MaxSize=MaxSize;
return Q;
}
//判断队列是否为满 (Rear+1)%数组长度=Front
bool IsFull(Queue Q)
{
return ((Q->Rear+1)%Q->MaxSize==Q->Front);
}
//入队
bool AddQ(Queue Q,ElementType X)
{
if(IsFull(Q))
{
printf("the Queue is full\n");
return false;
}
else
{
Q->Rear=(Q->Rear+1)%Q->MaxSize;
Q->Data[Q->Rear]=X;
return true;
}
}
//判断队列是否为空 Rear=Front
bool IsEmpty(Queue Q)
{
return (Q->Front==Q->Rear);
}
//出队
ElementType DeleteQ(Queue Q)
{
if(IsEmpty(Q))
{
printf("the queue is empty\n");
return ERROR;
}
else
return Q->Front=(Q->Front+1)%Q->MaxSize;
}