队列特点先进先出
队列声明
#ifndef _ArrayQueue_h
struct QueueRecord;
typedef struct QueueRecord *Queue;
int IsEmpty(Queue Q);
int IsFull(Queue Q);
Queue CreateQueue(int MaxElements);
void DisposeQueue(Queue Q);
void MakeEmpty(Queue Q);
void Enqueue(int X, Queue Q);
int Front(Queue Q);
void Dequeue(Queue Q);
int FrontAndDequeue(Queue Q);
#endif
队列实现
#include <stdio.h> // stderr
#include <stdlib.h> // NULL
#include "ArrayQueue.h"
#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 MaxElements)
{
Queue Q;
if(MaxElements < MinQueueSize)
fprintf(stderr, "Queue size is too small");
Q = malloc(sizeof(struct QueueRecord));
if(Q == NULL)
fprintf(stderr, "Out of space");
Q->Array = malloc(sizeof(int) * MaxElements);
if(Q->Array == NULL)
fprintf(stderr, "Out of space");
Q->Capacity = MaxElements;
MakeEmpty(Q);
return Q;
}
/* 释放队列 */
void DisposeQueue(Queue Q)
{
if(Q != NULL)
{
free(Q -> Array);
free(Q);
}
}
/* 构造空队列 */
void MakeEmpty(Queue Q)
{
Q->Size = 0;
Q->Front = 1;
Q->Rear = 0;
}
/* 入队 */
static int Succ(int Value, Queue Q)
{
if(++Value == Q->Capacity)
Value = 0;
return Value;
}
void Enqueue(int X, Queue Q)
{
if(IsFull(Q))
fprintf(stderr, "Full queue");
else
{
Q->Size++;
Q->Rear = Succ(Q->Rear, Q);
Q->Array[Q->Rear] = X;
}
}
/* 将队列头返回 */
int Front(Queue Q)
{
if(!IsEmpty(Q))
return Q->Array[Q->Front];
fprintf(stderr, "Empty queue");
return 0;
}
/* 出队列 */
void Dequeue(Queue Q)
{
if(IsEmpty(Q))
fprintf(stderr, "Empty queue");
else
{
Q->Size--;
Q->Front = Succ(Q->Front, Q);
}
}
/* 将队列头元素返回并出队列 */
int FrontAndDequeue(Queue Q)
{
int tmp;
if(!IsEmpty(Q))
{
tmp = Q->Array[Q->Front];
Q->Size--;
Q->Front = Succ(Q->Front, Q);
return tmp;
}
fprintf(stderr, "Empty queue");
return 0;
}
测试队列
#include <stdio.h>
#include "ArrayQueue.h"
int main(void)
{
Queue q = CreateQueue(7);
Enqueue(10, q);
Enqueue(22, q);
Enqueue(1, q);
Enqueue(32, q);
Enqueue(56, q);
Enqueue(6, q);
Enqueue(78, q);
printf("%d\n", FrontAndDequeue(q));
printf("%d\n", Front(q));
Dequeue(q);
printf("%d\n", Front(q));
Dequeue(q);
printf("%d\n", Front(q));
Dequeue(q);
printf("%d\n", Front(q));
Dequeue(q);
printf("%d\n", Front(q));
Dequeue(q);
printf("%d\n", Front(q));
Dequeue(q);
printf("%d\n", Front(q));
Dequeue(q);
return 0;
}