C语言数据结构———循环队列(动态数组实现方式)

循环队列(动态数组实现方式)

有关队列相关知识请查看上一章

C语言数据结构———循环队列(静态数组实现方式)

一、队列数据类型定义

//循环队列(动态数组实现)
#define QUEUE_ZISE			6//队列长度

typedef struct TypeQueue
{
   int qFront;//队首
   int qRear;//队尾
   int *pBasic;//数据
}tQUEUE, *pQUEUE;
//tQUEUE 等效于 struct TypeQueue
//pQUEUE 等效于 struct TypeQueue *

二、队列初始化

队列初始化

//初始化队列
int * pInitQueue(pQUEUE queue)
{
	queue->pBasic = (int *)malloc(sizeof(int)* QUEUE_ZISE);//为队列动态申请内存
	if (queue->pBasic == NULL)
	{
		printf("队列申请内存失败,程序终止......\r\n");
		while (1);
	}

	//初始化队首/队尾
	queue->qFront = 0;
	queue->qRear  = 0;

	printf("动态队列初始化成功......\r\n");
	printf("数据基地址: 0x%08X\r\n", queue->pBasic);
	printf("队列长度  : %d\r\n", (QUEUE_ZISE - 1));
	printf("队首: %d    队尾: %d\r\n", queue->qFront, queue->qRear);

	return queue->pBasic;
}

三、判断队列是否为空

队列为空

//队列是否为空
bool bIsEmptyQueue(pQUEUE queue)
{
	//队首等于队尾则队列为空
	if (queue->qFront == queue->qRear)
		return true;
	else
		return false;
}

四、判断队列是否已满

队列已满

//队列是否为满
bool bIsFullQueue(pQUEUE queue)
{
	//队尾下个数据为队首则队列已满
	if (((queue->qRear + 1) % QUEUE_ZISE) == queue->qFront)
		return true;
	else
		return false;
}

五、数据入队

数据入队

//入队
void vEnterQueue(pQUEUE queue, int vale)
{
	if (bIsFullQueue(queue))
	{
		printf("队列已满,入队失败......\r\n");
		return;
	}

	queue->pBasic[queue->qRear] = vale;//入队值
	queue->qRear = (queue->qRear + 1) % QUEUE_ZISE;//队尾移至下个入队位置

	printf("入队成功!入队值为:%d    队首:%d    队尾:%d\r\n", vale, queue->qFront, queue->qRear);
}

六、数据出队

数据出队

//出队
int iOutQueue(pQUEUE queue)
{
	int oValue = 0;

	if (bIsEmptyQueue(queue))
	{
		printf("队列为空!出队失败......\r\n");
		return oValue;
	}

	oValue = queue->pBasic[queue->qFront];//出队值
	queue->qFront = (queue->qFront + 1) % QUEUE_ZISE;//队首移至下个出队位置

	printf("出队成功!出队值为:%d    队首:%d    队尾:%d\r\n", oValue, queue->qFront, queue->qRear);

	return oValue;
}

七、遍历队列

//遍历队列
void vTraverseQueue(pQUEUE queue)
{
	int iBasic = 0;

	if (bIsEmptyQueue(queue))
	{
		printf("队列为空!遍历失败......\r\n");
		return;
	}

	printf("队列数据: ");
	iBasic = queue->qFront;//队首
	while (iBasic != queue->qRear)//直到队尾
	{
		printf("%d  ", queue->pBasic[iBasic]);//队列值
		iBasic = (iBasic + 1) % QUEUE_ZISE;//下个数据位置
	}
	printf("\r\n");
}

八、获取队列使用空间

//队列使用空间
int iCountQueue(pQUEUE queue)
{
	int iBasic = 0;
	int len = 0;

	if (bIsEmptyQueue(queue))
		printf("队列为空......");

	if (bIsFullQueue(queue))
		printf("队列已满......");

	iBasic = queue->qFront;//队首
	while (iBasic != queue->qRear)//直到队尾
	{
		len++;//使用空间加一
		iBasic = (iBasic + 1) % QUEUE_ZISE;//下个数据位置
	}
	printf("队列使用空间为: %d\r\n", len);

	return len;
}

九、获取队列剩余空间

//队列剩余空间
int iResidueQueue(pQUEUE queue)
{
	int iBasic = 0;
	int len = 0;


	if (bIsEmptyQueue(queue))
		printf("队列为空......");

	if (bIsFullQueue(queue))
		printf("队列已满......");

	iBasic = queue->qFront;//队首
	while (iBasic != queue->qRear)//直到队尾
	{
		len++;//使用空间加一
		iBasic = (iBasic + 1) % QUEUE_ZISE;//下个数据位置
	}

	len = QUEUE_ZISE - 1 - len;//剩余空间
	printf("队列剩余空间为: %d\r\n", len);

	return len;
}

十、代码验证演示

void main(void)
{
	tQUEUE queue;

	queue.pBasic = pInitQueue(&queue);//初始化队列
	printf("\r\n");
	
	vEnterQueue(&queue, 10);//入队
	vEnterQueue(&queue, 20);
	vEnterQueue(&queue, 30);
	vEnterQueue(&queue, 40);
	vEnterQueue(&queue, 50);
	iCountQueue(&queue);//队列使用空间
	iResidueQueue(&queue);//队列剩余空间
	vTraverseQueue(&queue);//遍历队列
	printf("\r\n");

	iOutQueue(&queue);//出队
	iOutQueue(&queue);
	iOutQueue(&queue);
	iCountQueue(&queue);//队列使用空间
	iResidueQueue(&queue);//队列剩余空间
	vTraverseQueue(&queue);//遍历队列
	printf("\r\n");

	while (1);
}

十一、运行结果

动态队列初始化成功......
数据基地址: 0x015D9FA0
队列长度  : 5
队首: 0    队尾: 0

入队成功!入队值为:10    队首:0    队尾:1
入队成功!入队值为:20    队首:0    队尾:2
入队成功!入队值为:30    队首:0    队尾:3
入队成功!入队值为:40    队首:0    队尾:4
入队成功!入队值为:50    队首:0    队尾:5
队列已满......队列使用空间为: 5
队列已满......队列剩余空间为: 0
队列数据: 10  20  30  40  50

出队成功!出队值为:10    队首:1    队尾:5
出队成功!出队值为:20    队首:2    队尾:5
出队成功!出队值为:30    队首:3    队尾:5
队列使用空间为: 2
队列剩余空间为: 3
队列数据: 40  50

运行结果2

运行结果2

运行结果3

运行结果4

运行结果5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值