广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言数据结构算法基础之循环队列示例
  • 150
分享到

C语言数据结构算法基础之循环队列示例

2024-04-02 19:04:59 150人浏览 泡泡鱼
摘要

目录说明示例代码1. 首先定义结构体:2. 定义各种算法:3. 测试:4. 最后的结果:说明 循环队列是一种先进先出的,首尾相连的队列。 大致的结构如下图: 用数组来抽象的表示一下

说明

循环队列是一种先进先出的,首尾相连的队列。

大致的结构如下图:

数组来抽象的表示一下的话,如下图:

循环队列有两个指针指向数据,上图中的start和end就是那两个指针,它们指向相同的位置,表示的是空,即队列是空的。

随着数据的放入,队列一般有下面的两种形式:

需要注意第二种形式,从图上看end在start的前面了,但是因为循环关系,前后并不重要。

另外需要考虑的是队列满的情况:

但这种情况存在一个问题,即空队列和满队列没有办法区分了,end和start都指向了相同的位置。

为了解决这个问题,一个方法是空出一个位置不放数据,当end再加一个数据就等于start的时候就认为队列是满的:

这时实际的数据长度就会比分配的少1。

下面是队列中空和满的判断:

1. 队列为空时:end == start

2. 队列为满时:(end + 1) % size == start

这里的size是指分配的空间大小,而不是队列长度,队列的实际长度为(end - start + size) % size,最大长度是size-1

这也是因为要考虑循环的关系,所以要加上%size这个操作。

示例代码

1. 首先定义结构体:

//定义循环队列
typedef struct _LoopQueue {
	int data[8];		//存放数据
	int start;		//头指针
	int end;		//尾指针
} LoopQueue;

2. 定义各种算法:

#define TRUE	1
#define FALSE	0
#define SIZE	8
//初始化队列
int init(LoopQueue *lq) {
	lq->start = 0;
	lq->end = 0;
	return TRUE;
}
//判断队列是否为空
int isEmpty(LoopQueue *lq) {
	if (lq->start == lq->end) {
		return TRUE;
	}
	return FALSE;
}
//判断队列是否为满
int isFull(LoopQueue *lq) {
	if ((lq->end + 1) % SIZE == lq->start) {
		return TRUE;
	}
	return FALSE;
}
//获取队列的长度
int getLength(LoopQueue *lq) {
	return (lq->end - lq->start + SIZE) % SIZE;
}
//插入数据
int pushQueue(LoopQueue *lq, int data) {
	if(isFull(lq)) {
		printf("Queue is full.\n");
		return FALSE;
	}
	lq->data[lq->end] = data;
	lq->end = (lq->end + 1) % SIZE;
	return TRUE;
}
//弹出数据
int popQueue(LoopQueue *lq, int *data) {
	if (isEmpty(lq)) {
		printf("Queue is empty.\n");
		return FALSE;
	}
	*data = lq->data[lq->start];
	lq->start = (lq->start + 1) % SIZE;
	return TRUE;
}
//显示队列中的数据
void printQueue(LoopQueue *lq) {
	int index;
	int count;
	count = getLength(lq);
	if (0 == count) {
		printf("No data.\n");
		return;
	}
	for (index = 0; index < count; index++) {
		printf("%d ", lq->data[index]);
	}
	printf("\n");
	return;
}

3. 测试:

int main()
{
	int index;
	int num;
	//队列测试代码
	LoopQueue *lq = (LoopQueue *)malloc(sizeof(LoopQueue));
	init(lq);
	printQueue(lq);
	for (index = 0; index < SIZE; index ++) {	//注意这里要放8个数据,但是实际上只能放7个,所以最后一个会报错
		pushQueue(lq, index);
	}
	printQueue(lq);
	for (index = 0; index < SIZE; index ++) {	//同上,会打印一个错误
		if (popQueue(lq, &num)) {
			printf("%d\n", num);
		}
	}
	printQueue(lq);
	return 0;
}

4. 最后的结果:

以上就是C语言数据结构算法基础之循环队列的详细内容,更多关于C语言数据结构算法循环队列的资料请关注编程网其它相关文章!

--结束END--

本文标题: C语言数据结构算法基础之循环队列示例

本文链接: https://www.lsjlt.com/news/150604.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言数据结构算法基础之循环队列示例
    目录说明示例代码1. 首先定义结构体:2. 定义各种算法:3. 测试:4. 最后的结果:说明 循环队列是一种先进先出的,首尾相连的队列。 大致的结构如下图: 用数组来抽象的表示一下...
    99+
    2022-11-13
  • C语言数据结构之队列算法详解
    目录一、前言二、基本概念三、顺序队列四、链队列五、循环队列六、总结与提高一、前言 队列在程序设计中经常出现,如:操作系统中的排队问题。 这篇文章主要介绍了队列的...
    99+
    2022-11-12
  • java数据结构基础:顺序队列和循环队列
    目录队列:顺序队列:代码实现:循环队列:代码实现:总结队列: 队列是一种受限制的线性表 只允许在表的一端进行插入,另一端进行删除 插入的一端称作队尾,删除的一端称作队头 具有先进先出...
    99+
    2022-11-12
  • JavaScript数据结构之优先队列与循环队列的示例分析
    这篇文章将为大家详细讲解有关JavaScript数据结构之优先队列与循环队列的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体如下:优先队列实现一个优先队列:设...
    99+
    2022-10-19
  • Java数据结构与算法之循环队列的实现
    目录概述循环队列循环队列实现改变队列大小enqueue 方法dequeue 方法main完整代码 概述 从今天开始, 小白我将带大家开启 Jave 数据结构 & 算法的新篇章...
    99+
    2022-11-12
  • C语言数据结构之链队列的基本操作
    目录1.队列的定义2.队列的表示和实现(1)初始化操作(2)销毁队列(3)入队操作(4)出队操作附录完整代码:总结1.队列的定义 队列 (Queue)是另一种限定性的线性表,它只允许...
    99+
    2022-11-12
  • C语言数据结构与算法之队列的实现详解
    目录队列的概念及结构队列的实现Queue.hQueue.cTest.c队列的概念及结构 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FI...
    99+
    2022-11-13
    C语言数据结构 队列 C语言 队列实现 C语言 队列
  • C利用语言实现数据结构之队列
    目录一、链队列二、链队的表示三、链队的基本操作1. 链队的初始化2. 链队的销毁3. 入队4. 出队四、顺序队列五、循环队列1. 初始化2. 求队列长度3. 入队4. 出队 前言: ...
    99+
    2022-11-12
  • C语言数据结构之队列的定义与实现
    目录一、队列的性质二、队列的结构三、代码实现头文件功能函数一、队列的性质 上次我们学习栈,了解到栈储存释放数据的方式是:先进后出 而队列与其相反,队列是:先进先出,后进后出。 二、队...
    99+
    2022-11-13
  • c语言数据结构之栈和队列详解(Stack&Queue)
    目录简介栈一、栈的基本概念1、栈的定义2、栈的常见基本操作二、栈的顺序存储结构1、栈的顺序存储2、顺序栈的基本算法3、共享栈(两栈共享空间)三、栈的链式存储结构1、链栈2、链栈的基本...
    99+
    2022-11-13
  • C语言数据结构不挂科指南之队列详解
    目录队列队列基本概念循环队列顺序队列的 C 语言实现链式队列的 C 语言实现自考要点队列 这篇博客主要介绍一下队列的概念,并且采用 C 语言,编写两种存储实现方式:顺序存储和链式存储...
    99+
    2022-11-13
  • C语言数据结构进阶之栈和队列的实现
    目录栈的实现:一、栈的概念和性质二、栈的实现思路三、栈的相关变量内存布局图四、栈的初始化和销毁五、栈的接口实现:1.入栈2.出栈3.获取栈顶的数据4.获取栈的元素个数5.判断栈是否为...
    99+
    2022-11-12
  • C语言数据结构之栈与队列的相互实现
    目录一、用对列实现栈代码实现二、用栈实现队列代码实现一、用对列实现栈 题干要求: 细节分析:队列是先进先出; 要实现的栈是先进后出。 解题思路:假设:先用一个队列储存数据 N 个,...
    99+
    2022-11-13
  • C语言数据结构之队列怎么定义与实现
    今天小编给大家分享一下C语言数据结构之队列怎么定义与实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、队列的性质上次我们...
    99+
    2023-07-02
  • C语言数据结构之栈与队列怎么相互实现
    本篇内容介绍了“C语言数据结构之栈与队列怎么相互实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、用对列实现栈题干要求:细节分析:队列是...
    99+
    2023-07-02
  • C语言中队列的结构和函数接口的使用示例
    目录一、队列的结构二、队列的函数接口1. 初始化和销毁2. 入队和出队3. 访问队头和队尾元素4. 判空和元素个数一、队列的结构 队列:一种操作受限的线性表,只允许在线性表的一端进行...
    99+
    2023-02-14
    C语言队列结构 C语言函数接口
  • C++零基础精通数据结构之带头双向循环链表
    目录与单链表的区别代码的实现接口节点的构造初始化链表开辟节点销毁链表打印链表尾插链表尾删链表头插链表头删链表查找链表链表pos位置的删除总结与单链表的区别 单向/双向 单向:只有一个...
    99+
    2022-11-13
  • C语言数据结构与算法之链表(一)
    目录引言链表的相关思考链表结点结构建立链表实现插入操作完整代码引言 在存储一大波数的时候,我们通常使用的是数组,但是数组有时候又会显得不够灵活,比如下面这个例子: 有一串已经排序好的...
    99+
    2022-11-12
  • C语言数据结构与算法之链表(二)
    目录引入模拟链表介绍插入代码实现代码实现  引入 在上一节的学习中我们介绍了C语言如何实现链表,但是,在这一章,我们将抛开令人头秃的指针和结构体,我们将另外使用一种数组来实现的方式,...
    99+
    2022-11-12
  • C语言数据结构与算法之单链表
    目录基本概念读取数据元素获取第i个结点的数据元素插入数据元素 初始化链表打印链表顺序表查空顺序表的删除 删除第i个结点及其数据元素情况1:当删除的是第一个元素情况2:除第一个结点外完...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作