数据结构之循环队列

数据结构之循环队列数据结构之循环队列前言:关于循环队列需明白以下几点:1、循环队列是队列的顺序存储结构2、循环队列用判断是否为空利用Q.front=Q.rear3、循环队列头指针始终指向队列头元素,而尾指针始终指向队列尾元素的下一个位置4、按照队列的定义,队头删除,队尾插入,在这里插入图片描述会导致队头之前可能有空余的内存空间(如下图J1,J2出队后,空间被浪费),为了解决该问题,提出循环队列的解决方…

大家好,又见面了,我是你们的朋友全栈君。

数据结构之循环队列

前言:
关于循环队列需明白以下几点:
1、循环队列是队列的顺序存储结构
2、循环队列用判断是否为空利用 Q.front=Q.rear
3、循环队列头指针始终指向队列头元素,而尾指针始终指向队列尾元素的下一个位置
4、按照队列的定义,队头删除,队尾插入,在这里插入图片描述会导致队头之前可能有空余的内存空间(如下图J1,J2出队后,空间被浪费),为了解决该问题,提出循环队列的解决方案
在这里插入图片描述
5、循环队列通过浪费一个空间,利用(Q.rear+1)%maxSize=Q.front判断队列是否为满,以此解决队列空间浪费问题(如下图所示)
在这里插入图片描述
一、循环队列的基本操作的实现代码

// 循环队列.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"

#define  maxQueueSize 5 //事先确定的最大队列长度

typedef int QElemType;

typedef struct
{
	QElemType *base;//初始化动态分配的指定长度的空间
	int front;//头指针,若队列不空,指向队列头元素
	int rear;//尾指针,若多列不空,指向队列尾元素的下一个位置
}SqQueue;

/*循环队列初始化*/
bool InitQueue(SqQueue *Q)
{
	Q->base=(QElemType*)malloc(maxQueueSize*sizeof(QElemType));
	if (!Q->base)
	{
		return false;
	}
	Q->front=0;
	Q->rear=0;
	printf("循环队列初始化完成!\n");
	return true;
}

/*循环队列入队*/
bool EnQueue(SqQueue *Q,QElemType e)
{
	if ((Q->rear+1)%maxQueueSize==Q->front)//队列满
	{
		return false;
	}
	Q->base[Q->rear]=e;
	Q->rear=(Q->rear+1)%maxQueueSize;
	printf("%d 入队完成!\n",e);
	return true;
}

/*循环队列出队*/
bool DeQueue(SqQueue *Q,QElemType *e)
{
	if (Q->front==Q->rear)//队列空
	{
		return false;
	}
	*e=Q->base[Q->front];
	Q->front=(Q->front+1)%maxQueueSize;
	printf("%d 出队完成!\n",*e);
	return true;
}

/*打印循环队列*/
void printfQueue(SqQueue Q)
{
	printf("打印循环队列如下\n");
	while (Q.front!=Q.rear)
	{
		if (Q.front==maxQueueSize &&(Q.rear+1)%maxQueueSize!=Q.front)
		{
			Q.front=0;
		}
		printf("%d ",Q.base[Q.front]);
		Q.front++;
	}
	printf("\n");
}

int _tmain(int argc, _TCHAR* argv[])
{
	SqQueue *Q=(SqQueue*)malloc(sizeof(SqQueue));
	InitQueue(Q);

	EnQueue(Q,6);
	EnQueue(Q,8);
	EnQueue(Q,10);
	EnQueue(Q,12);
	printfQueue(*Q);
	QElemType *e=(QElemType*)malloc(sizeof(QElemType));
	DeQueue(Q,e);
	DeQueue(Q,e);
	EnQueue(Q,14);
	EnQueue(Q,16);
	printfQueue(*Q);

	system("pause");
	return 0;
}

循环队列运行过程图如下:
在这里插入图片描述
程序实际运行结果如下,对比上面出队入队图,也就对循环队列有了更深的理解:
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/137272.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月2日 上午10:36
下一篇 2022年6月2日 上午10:36


相关推荐

  • 《智谱清言》对话记录删除方法

    《智谱清言》对话记录删除方法

    2026年3月12日
    7
  • linux 重启redis 命令

    linux 重启redis 命令redis 已经加入到 etc 下也就是服务器启动 redis 也启动 突然发现连不上 redis 所以上来看看查看 redis 状态 systemctlsta redis service redis serverLoaded loaded usr lib systemd system redis service disabled vendorpreset disabled Active inactive dead 发现没启动启动后再看看状态 systemctl

    2026年3月17日
    2
  • DeepSeek-V3.2开源模型技术解析:DSA稀疏注意力与GRPO训练框架突破

    DeepSeek-V3.2开源模型技术解析:DSA稀疏注意力与GRPO训练框架突破

    2026年3月12日
    3
  • 什么是oracle数据库实例_oracle库和实例区别

    什么是oracle数据库实例_oracle库和实例区别一、数据库(Database)  数据库是一个数据的集合,不仅是指物理上的数据,也指物理、存储及进程对象的一个组合。Oracle是关系型数据库管理系统(RDBMS)。二、实例(Instance)  数据库实例(也称为服务器Server)就是用来访问一个数据库文件集的一个存储结构及后台进程的集合。它使一个单独的数据库可以被多个实例访问(也就是ORACLE并行服务器–

    2022年8月30日
    5
  • C++:用memset初始化数组

    C++:用memset初始化数组1 初始化数组定义完数组之后有三种初始化方式 intA 20 0 intA 20 for i 0 i

    2026年3月26日
    2
  • 中石化面试题java,中石化面试经验

    中石化面试题java,中石化面试经验面试过程:应聘途径:社会招聘面试内容:1对1面试面试难度:简单面试感觉:一般面试官提的问题:到了面试那里,像上次那样在会议室等着。大概有四、五十人左右吧,分成了几组人,第一组人先去做性格测评,说要八十分钟左右,其他人在等,说那些领导在开会,商议面试的事宜。领导开会开到十一点半才出来,宣讲一下相关内容,结果把一些还没做完测试的人拉了下来。宣讲完,那些做完测试的人就先去面试,因为估计不到什么时候才面完…

    2022年10月15日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号