C源码@数据结构与算法->队列(queue)

本文详细探讨了如何使用C语言实现数据结构中的队列。通过讲解队列的基本概念、操作以及实例代码,深入理解其工作原理。内容包括静态队列和动态链式队列的创建、入队、出队等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
 * testqueue.cpp
 */
#include 
#include "queue.h"

int main()
{
	Queue Q = NULL;
	int i;

	Q = CreateQueue(12);

	for (i = 0; i < 10; ++i)
	{
		Enqueue(i, Q);
	}

	while (!IsEmpty(Q))
	{
		printf("%d\n", Front(Q));
		Dequeue(Q);
	}

	for (i = 0; i < 10; ++i)
	{
		Enqueue(i, Q);
	}

	while (!IsEmpty(Q))
	{
		printf("%d\n", Front(Q));
		Dequeue(Q);
	}

	DisposeQueue(Q);

	return 0;
}

/*
 * queue.h
 */
#ifndef _QUEUE_H
#define _QUEUE_H

#ifndef NULL
#define NULL (0)
#endif

typedef int ElementType;

struct QueueRecord;
typedef struct QueueRecord *Queue;

#ifdef __cplusplus
extern "C" {
#endif

Queue CreateQueue(int MaxElements);
void MakeEmpty(Queue Q);
void DisposeQueue(Queue Q);
int IsEmpty(Queue Q);
int IsFull(Queue Q);
void Enqueue(ElementType X, Queue Q);
void Dequeue(Queue Q);
ElementType Front(Queue Q);
ElementType FrontAndDequeue(Queue Q);

#ifdef __cplusplus
}
#endif

#endif
/*
 * queue.cpp
 */
#include 
#include "fatal.h"
#include "queue.h"

#define MiniQueueSize (10)

struct QueueRecord
{
	int Capacity;
	int Front;
	int Rear;
	int Size;
	ElementType *Array;
};

Queue CreateQueue(int MaxElements)
{
	Queue Q;

	if (MaxElements < MiniQueueSize)
	{
		FatalError("Queue size is too small!");
	}

	Q = (Queue)malloc(sizeof(struct QueueRecord));
	if (Q == NULL)
	{
		FatalError("Out of memory!");
	}

	Q->Array = (ElementType *)malloc(sizeof(ElementType) * MaxElements);
	if (Q->Array == NULL)
	{
		FatalError("Out of memory!");
	}

	Q->Capacity = MaxElements;

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

int IsEmpty(Queue Q)
{
	return Q->Size == 0;
}

int IsFull(Queue Q)
{
	return Q->Size == Q->Capacity;
}

static int Succ(int Index, Queue Q)
{
	if (++Index == Q->Capacity)
	{
		Index = 0;
	}
	return Index;
}

void Enqueue(ElementType X, Queue Q)
{
	if (IsFull(Q))
	{
		FatalError("Qull queue!");
	}
	else
	{
		++Q->Size;
//		Q->Rear = Succ(Q->Rear, Q);
		Q->Rear = (++Q->Rear == Q->Capacity) ? 0 : Q->Rear;
		Q->Array[Q->Rear] = X;
	}
}

void Dequeue(Queue Q)
{
	if (IsEmpty(Q))
	{
		FatalError("Empty queue!");
	}
	else
	{
		--Q->Size;
//		Q->Front = Succ(Q->Front, Q);
		Q->Front = (++Q->Front == Q->Capacity) ? 0 : Q->Front;
	}
}

ElementType Front(Queue Q)
{
	if (IsEmpty(Q))
	{
		FatalError("Empty queue!");
		return -1;				/* Return value used to avoid warning */
	}
	else
	{
		return Q->Array[Q->Front];
	}
}

ElementType FrontAndDequeue(Queue Q)
{
	ElementType X = -1;

	if (IsEmpty(Q))
	{
		FatalError("Empty queue!");
	}
	else
	{
		--Q->Size;
		X =  Q->Array[Q->Front];
//		Q->Front = Succ(Q->Front, Q);
		Q->Front = (++Q->Front == Q->Capacity) ? 0 : Q->Front;
	}

	return X;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值