c/c++ 数据结构 循环队列

一、代码概述

本代码实现了一个基于数组的循环队列(Circular Queue)的基本操作,包括初始化、销毁、判断队列是否为空、判断队列是否已满、入队(Push)、出队(Pull)以及显示队列内容。循环队列是一种特殊的线性数据结构,其操作表现基于FIFO(先进先出)原则,并且其首尾相连,形成一个逻辑上的环状。

二、代码结构

  1. 结构体定义
    结构体CirQueue定义了一个循环队列,包含一个整数数组data用于存储数据,以及两个整型变量frontrear分别表示队首和队尾的索引位置。

  2. 函数定义

    • InitCirQueue:初始化循环队列,分配内存并设置队首队尾索引为0。
    • DestroyCirQueue:销毁循环队列,释放内存。
    • EmptyCirQueue:判断循环队列是否为空。
    • FullCirQueue:判断循环队列是否已满。
    • PushCirQueue:将元素入队,如果队列已满则返回false。
    • PullCirQueue:将元素出队,如果队列为空则返回false。
    • DispCirQueue:显示循环队列的当前内容。
  3. 主函数
    main函数中,首先初始化一个循环队列C,然后进行了一系列的操作来测试循环队列的功能,包括入队、出队和显示队列内容。最后,销毁了循环队列。

三、代码细节解释

  1. 结构体定义
    这里定义了一个结构体CirQueue,包含一个大小为Maxsize(10)的整数数组data,以及两个整型变量frontrear

    #include<stdio.h>
    #include<malloc.h>
    #define Maxsize 10
    
    typedef struct
    {
    	int data[Maxsize];
    	int front, rear;
    }CirQueue;

  2. 初始化与销毁
    初始化函数InitCirQueue通过动态内存分配为CirQueue结构体分配内存,并将frontrear初始化为0。销毁函数DestroyCirQueue则释放这块内存。

    void InitCirQueue(CirQueue*& C)
    {
    	C = (CirQueue*)malloc(sizeof(CirQueue));
    	C->front = C->rear = 0;
    }//初始化
    
    void DestroyCirQueue(CirQueue*& C)
    {
    	free(C);
    }//销毁
  3. 判断队列状态
    EmptyCirQueueFullCirQueue函数分别通过比较frontrear的值来判断队列是否为空或已满。注意在判断队列是否已满时,使用了取模运算%来确保索引在数组范围内循环。

    bool EmptyCirQueue(CirQueue* C)
    {
    	return C->front == C->rear;
    }//判断是否为空
    bool FullCirQueue(CirQueue* C)
    {
    	return (C->rear + 1) % Maxsize == C->front;
    }//返回队列长度
  4. 入队与出队
    PushCirQueue函数在队列不满的情况下,将元素添加到队尾,并更新rear的值。

    bool PushCirQueue(CirQueue*& C, int a)
    {
    	if (FullCirQueue(C))
    		return false;
    	C->data[C->rear] = a;
    	C->rear = (C->rear + 1) % Maxsize;
    	
    	return true;
    }

    PullCirQueue函数在队列不为空的情况下,从队首取出元素,并更新front的值。

    bool PullCirQueue(CirQueue*& C, int& a)
    {
    	if (EmptyCirQueue(C))
    		return false;
    	a = C->data[C->front];
    	C->front=(C->front + 1) % Maxsize;
    	return true;
    }
  5. 显示队列内容
    DispCirQueue函数遍历队列并打印出所有元素。如果队列为空,则打印“循环队列为空”。

    void DispCirQueue(CirQueue* C)
    {
    	if (C->front == C->rear)
    		printf("循环队列为空\n");
    	else
    	{
    		int index = C->front;
    		do {
    			printf("%d ", C->data[index]);
    			index = (index + 1) % Maxsize;
    		} while (index != C->rear);
    		printf("\n");
    	}
    }

  6. 主函数中的操作
    main函数中,通过调用上述函数来测试循环队列的功能。首先,初始化一个空队列,并验证其为空。然后,通过循环将元素0到8入队,并显示每次入队后的队列内容。接着,将队列中的前5个元素出队,并显示每次出队后的队列内容。最后,再次入队一些元素并显示队列内容,最后销毁队列。

    int main()
    {
    	CirQueue* C;
    	InitCirQueue(C);
    	if (EmptyCirQueue(C))
    		printf("循环队列为空\n");
    	printf("\n开始进队\n");
    	for (int i = 0; i < 9; i++)
    	{
    		printf("元素%d进队:", i);
    		PushCirQueue(C, i);
    		DispCirQueue(C);
    	}
    	printf("\n开始出队\n");
    	for (int i = 0; i < 5; i++)
    	{
    		int value = 0;
    		PullCirQueue(C, value);
    		printf("元素%d出队:", value);
    		DispCirQueue(C);
    	}
    
    	printf("\n再由队尾入队\n");
    	for (int i = 9; i < 13; i++)
    	{
    		printf("元素%d进队:", i);
    		PushCirQueue(C, i);
    		DispCirQueue(C);
    	}
    	DestroyCirQueue(C);
    }

四、总结

本代码实现了一个基于数组的循环队列,并提供了基本的操作函数。通过主函数的测试,可以验证该循环队列的实现是正确且有效的。

  • 24
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值