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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值