C实现队列
队列特点先进先出
队列声明
- #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;
- }