数组
保留一个数组以及两个位置Front和Rear,分别代表队首和队尾。
当一个元素入队时,Rear加1;离队则Front-1。其中若超出了数组的范围,则循环到数组的开头
- 类型声明及定义
struct QueueRecord;
typedef struct QueueRecord *Queue;
#define MinQueueSize (5)
struct QueueRecord{
int Capacity;
int Front;
int Rear;
int Size;
int *Array;
}
- 测试是否为空
int IsEmpty(Queue Q)
{
return Q->Size==0;
}
- 测试是否为满
int IsFull(Queue Q)
{
return Q->Size==Q->Capacity;
}
- 创建队列
Queue CreateQueue(int MaxQueueSize)
{
Queue Q;
Q=malloc(sizeof(struct QueueRecord));
if(Q==NULL)
{
FatalError("Out of Space");
}
Q->Array=malloc(sizeof(int)*MaxQueueSize);
if(Q->Array==NULL)
FatalError("Out of Space");
Q->Capacity=MaxQueueSize;
MakeEmpty(Q);
return Q
}
void MakeEmpty(Queue Q)
{
Q->Size=0;
Q->Front=1;
Q->Rear=0;
}
- 释放栈
void DisposeQueue(Queue Q)
{
if(Q!=NULL)
{
free(Q->Array);
free(Q);
}
}
- 入队
void Enqueue(int X,Queue Q)
{
if(IsFull(Q))
Error("Full Queue");
else{
Q->Size++;
Q->Rear=Succ(Q->Rear,Q);
Q->Array[Q->Rear]=X;
}
}
//循环数组实现
int Succ(int Value,Queue Q)
{
if(++Value==Q->Capacity)
value=0;
return Value;
}
- 出队
void Dequeue(Queue Q)
{
if(IsEmpty(Q))
Error("Empty Queue");
else{
Q->Size--;
Q->Front=Succ(Q->Front,Q);
}
}