数据结构(C语言):顺序循环队列的基本操作

一、题目

设队列的元素类型为char,实现顺序循环队列的各种基本操作的程序:

① 初始化队列Q;

② 判断队列Q是否为空;

③ 入队操作。循环调用入队操作,将若干元素(不少于10个)入队;

④ 出队操作,出队一个元素,并输出该元素;

⑤ 输出队列元素个数;

⑥ 调用入队操作,依次入队4个元素;

⑦ 输出队列序列;

⑧ 主函数通过函数调用实现以上各项操作。

二、算法思路

1、定义队列结构体:包括数组首元素地址,首元素数组下标(首指针),尾元素数组下标(尾指针)。

2、初始化循环队列的函数:在内存中开辟一段连续的内存空间储存数组的元素,将首指针和尾指针均赋值为0。

3、队列判空函数:若首指针等于为指针,则队列为空。

4、判断队列是否已满的函数:若(Q->rear+1)%MAX_SIZE==Q->front

即队尾即将追上队头,则队列已满。

5、入队操作:若队列未满,则为尾指针指向的元素赋值,再将尾指针后移一位,若尾指针达到最大值,则将尾指针重置为0。

6、出队操作:若队列不为空,则出队一个元素,并用e储存该元素,再将头指针后移一位,若头指针达到最大值,则将头指针重置为0。

7、输出元素个数的函数:返回(Q->rear - Q->front + MAX_SIZE) % MAX_SIZE

8、输出队列元素:利用循环打印队列中的元素。

9、主函数:依次调用上述函数实现程序功能。

三、完整代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef char ElemType;
typedef int Status;
#define MAX_SIZE 6	//队列最多能存储MAX_SIZE-1个元素,多出来的一份空间不放元素,用于判断队列是否已满
#define FALSE 0
#define TRUE 1
#define ERROR 0
#define OK 1

typedef struct Queue {
	ElemType *data;
	int front;//头指针(用数组下标表示)
	int rear;//尾指针(用数组下标表示)
};

void InitQueue(Queue*Q)//初始化队列的函数
{
	Q->data = (ElemType*)malloc(sizeof(ElemType) * MAX_SIZE);
	Q->front = Q->rear = 0;//头指针和尾指针都为0,队列为空       
}

Status QueueEmpty(Queue* Q)//队列判空函数
{
	if (Q->front == Q->rear)//为空返回TRUE
		return TRUE;
	else//否则返回FALSE
		return FALSE;
}

Status QueueFull(Queue* Q)//判断队列是否已满的函数
{
	if ((Q->rear+1)%MAX_SIZE==Q->front)//若队尾即将追上队头,则队列已满,返回TRUE
		return TRUE;
	else//否则返回FALSE
		return FALSE;
}

Status AddElem(Queue* Q)//入队操作
{
	if (QueueFull(Q))//判断队列是否已满
		return ERROR;
	getchar();//吸收上一次输入后字符结尾处的\n(我想了半天才想到这一点!)
	Q->data[Q->rear] = getchar();
	Q->rear = (Q->rear + 1) % MAX_SIZE;//尾指针向后移动一位,若rear为MAX_SIZE-1,则将rear重置为0
	return OK;
}

void AddSomeElem(Queue* Q)//入队若干元素的操作
{
	int n;
	printf("请输入需要入队的元素个数:");
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		printf("请输入第%d个元素的值:", i + 1);
		if (!AddElem(Q))//入队操作
		{
			printf("队列已满!");
			break;
		}
	}
}

Status DeleteElem(Queue* Q,ElemType*e)//出队操作,出队一个元素,并用e储存该元素
{
	if (QueueEmpty(Q))//判断队列是否为空
		return ERROR;
	else
	{
		*e = Q->data[Q->front];
		Q->front = (Q->front + 1) % MAX_SIZE;//尾指针向后移动一位,若front为MAX_SIZE-1,则将front重置为0
	}
	return OK;
}

int NumQueue(Queue* Q)//输出元素个数
{
	return (Q->rear - Q->front + MAX_SIZE) % MAX_SIZE;
}

void PrintQueue(Queue* Q)//输出队列元素
{
	printf("队列中的元素为:");
	for (Q->front; Q->front != Q->rear; Q->front=(Q->front+1)%MAX_SIZE)//打印下标从Q->front到Q->rear-1的数组元素
		printf("%c ", Q->data[Q->front]);
}

int main()
{
	Queue* Q = (Queue*)malloc(sizeof(Queue));
	InitQueue(Q);//初始化队列的函数
	if (QueueEmpty(Q))
		printf("队列为空!\n");
	else
		printf("队列不为空!\n");
	AddSomeElem(Q);//入队十个以上元素
	if (QueueEmpty(Q))
		printf("队列为空!\n");
	else
		printf("队列不为空!\n");
	char* e = (ElemType*)malloc(sizeof(ElemType));
	DeleteElem(Q,e);//出队一个元素
	printf("出队元素的值是:%c\n", *e);
	printf("队列中的元素数量是:%d\n", NumQueue(Q));//输出元素个数的函数
	AddSomeElem(Q);//入队四个元素
	PrintQueue(Q);//输出队列元素
}

四、运行结果

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/25461.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

优化带排序的分页查询

优化带排序的分页查询 浅分页&#xff1a; select user_no,user_name,socre from student order by score desc limit 5,20 深分页&#xff1a; select user_no,user_name,socre from student order by score desc limit 80000,20 因为偏移量深分页更大&#xff0c;所以深分页执…

【软件】无联网情况下安装Win11 / 华为电脑更换Win11系统后触摸屏、声卡失效物理解决方案

一、提前备份好电脑驱动&#xff08;华为电脑更换Win11系统后触摸屏、声卡失效物理解决方案&#xff09; 1.电脑驱动备份方法&#xff1a; 1&#xff09;通过管理员身份打开命令提示符。 2&#xff09;输入命令&#xff1a;dism /online /export-driver /destination:"D…

聊聊Go语言的控制语句

在高级编程语言中&#xff0c;控制流语句(control-flow statement)是一类用于控制程序执行流程的语句&#xff0c;以下简称为控制语句。它们可以根据条件或循环执行相应的代码块&#xff0c;或者跳转到指定位置执行代码。 常见的控制语句包括&#xff1a; 条件语句&#xff1a;…

10. python字典

文章目录 一、什么是字典二、访问键-值对三、添加、修改键-值对四、删除键-值对4.1 语句del4.2 方法pop() 五、创建空字典六、遍历字典6.1方法items()6.2方法keys()6.3方法values() 七、嵌套7.1 字典列表7.2 在字典中存储列表7.3 在字典中存储字典 一、什么是字典 #创建一个字…

电商服务智能解决方案

互联网时代&#xff0c;智能客服已成为电商企业客户服务、管理和运营的标配。面临大量客户咨询、订单流程等业务&#xff0c;传统人工客服工作时间有限、人员流动性大、人工成本持续上涨等&#xff0c;已经无法满足电商企业“数智化”转型的需求&#xff0c;这也促使AI成为电商…

SpringSecurity入门

简介 官网地址&#xff1a;https://spring.io/projects/spring-security#overview Spring家族当中&#xff0c;一个安全管理框架 Shiro也是一个安全框架&#xff0c;提供了很多安全功能。Shiro比较老&#xff0c;旧的项目当中&#xff0c;可能还在使用。上手还挺简单 在新项…

Zemax Lumerical | 二维光栅出瞳扩展系统优化

简介 本文提出并演示了一种以二维光栅耦出的光瞳扩展&#xff08;EPE&#xff09;系统优化和公差分析的仿真方法。 在这个工作流程中&#xff0c;我们将使用3个软件进行不同的工作 &#xff0c;以实现优化系统的大目标。首先&#xff0c;我们使用 Lumerical 构建光栅模型并使用…

(双指针 ) 18. 四数之和 ——【Leetcode每日一题】

❓18. 四数之和 难度&#xff1a;中等 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四元组重…

不愧是阿里,扣的真细。

铜三铁四已经过去了&#xff0c;今天的行情虽然没有以前好&#xff0c;但是相比去年来说也算是好了一些了。有一些人已经在这个招聘季拿到了不错的Offer了。 今天给大家分享一份面经&#xff0c;今天这位朋友的背景是Java五年本&#xff0c;2023年前被毕业后投入了面试大军怀抱…

融合改进Sine混沌映射的新型粒子群优化算法(NIPSO)-附代码

融合改进Sine混沌映射的新型粒子群优化算法(NIPSO) 文章目录 融合改进Sine混沌映射的新型粒子群优化算法(NIPSO)1.粒子群优化算法2. 改进粒子群优化算法2.1 改进的 Sine 混沌映射2.2 粒子群改进 3.实验结果4.参考文献5.Matlab代码6.Python代码 摘要&#xff1a;为了应对传统粒子…

OpenGl之摄像机

文章目录 摄像机/观察空间摄像机位置摄像机方向右轴上轴 Look At自由移动移动速度鼠标输入缩放摄像机源码 OpenGL本身没有摄像机(Camera)的概念&#xff0c;但我们可以通过把场景中的所有物体往相反方向移动的方式来模拟出摄像机&#xff0c;产生一种我们在移动的感觉&#xff…

第12届蓝桥杯Scratch省赛真题集锦

编程题 第 1 题 问答题 下雨 题目说明 编程实现: 下雨。 具体要求: 1).点击绿旗,角色与背景如下图所示呈现在对应位置; 2).小猫说:“快下雨了,赶快回家”,小狗说:“我再玩一会”; 3).开始下雨,雨滴持续下落, 4).小猫躲在亭子里,雨滴在小猫和亭子后落下, 5).小狗在雨中…

java-基础语法(二)

java-基础语法(二) 一、流程控制语句 1.1 流程控制语句分类 顺序结构 分支结构(if, switch) 循环 结构(for, while, do…while) 1.2 顺序结构 顺序结构执行流程图&#xff1a; 1.3 分支结构之if语句 if语句格式1 格式&#xff1a;if (关系表达式) {语句体; }执行流程&…

【Jenkins+Ant+Jmeter】持续集成接口测试平台搭建

一、环境准备&#xff1a; 1、JDK&#xff1a;Java Downloads | Oracle 2、Jmeter&#xff1a;Apache JMeter - Download Apache JMeter 3、Ant&#xff1a;Apache Ant - Binary Distributions 4、Jenkins&#xff1a;Jenkins 二、Jemter脚本准备&#xff1a; 1、脚本目录&a…

云服务器和专用服务器之间的区别

在当今数字化时代&#xff0c;服务器是构建和支持各种应用和服务的基础设施之一。随着技术的发展和需求的增加&#xff0c;出现了不同类型的服务器&#xff0c;其中最常见的是云服务器和专用服务器。本文将详细介绍云服务器和专用服务器之间的区别&#xff0c;以帮助您更好地了…

多线程安全的案例展示与解决方案

一、概念 1. 什么是线程安全 当多个线程访问一个对象时&#xff0c;如果不用考虑这些线程在运行时环境下的调度和交替执行&#xff0c;也不需要进行额外的同步&#xff0c;或者在调用方进行任何其他的协调操作&#xff0c;调用这个对象的行为都可以获得正确的结果&#xff0c…

【Linux】iptables防火墙

文章目录 一、Linux防火墙基础1.Linux防火墙概术2.netfilter/iptables3.四表五链4.规则链之间的匹配顺序 二、iptables 安装1.常用的控制类型2.常用的管理选项 三、示例演示1.添加新的规则2.查看规则列表3.删除规则4.清空规则 四、规则的匹配1.通用匹配2.隐含匹配3.显式匹配 一…

Mybatis generator

文章目录 依赖式使用引入依赖配置文件设置生成使用中出现的异常 Mybatis中javaType和jdbcType对应关系int、bigint、smallint 和 tinyint是使用整数数据的精确数字数据类型。 插件式使用添加依赖和插件创建逆向工程的配置文件执行MBG插件的generate目标执行结果 逆向工程&#…

shell SNAT与DNAT

文章目录 SNATSNAT原理与应用SNAT实验 DNATDNAT原理与应用DNAT实验 SNAT SNAT原理与应用 SNAT 应用环境&#xff1a;局域网主机共享单个公网IP地址接入Internet&#xff08;私有不能早Internet中正常路由&#xff09; SNAT原理&#xff1a;修改数据包的源地址。 SNAT转换前提…

C++进阶 —— lambda表达式(C++11新特性)

目录 一&#xff0c;模板函数sort 二&#xff0c;lambda表达式 一&#xff0c;模板函数sort 在C98中&#xff0c;如对一个数据集合中的元素进行排序&#xff0c;可使用模板函数sort&#xff0c;如元素为自定义类型&#xff0c;需定义排序时的比较规则&#xff1b;随着C的发展…