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

news2024/11/24 11:22:57

一、题目

设队列的元素类型为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);//输出队列元素
}

四、运行结果

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode 49 字母异位词分组

LeetCode 49 字母异位词分组 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/group-anagrams/description/ 博主Github&#xff1a;https://github.com/GDUT-Rp/LeetCode 题目&#xff1a; 给你一个字符串数组&#x…

如何使用ChatGPT?初学者简单指南

Chat GPT 风靡全球&#xff0c;并在短时间内成为世界上增长最快的应用程序。随着所有关于其潜在影响的讨论&#xff0c;你可能会想知道&#xff1a;如何使用 ChatGPT&#xff1f; 使用 ChatGPT需要准备&#xff1a;一个 OpenAI 帐户和一个网络浏览器。 访问chat.openai.com并…

ICV报告:中国的数字经济与5G市场研究报告

近日&#xff0c;专注于前沿科技领域的国际咨询机构ICV发布了《中国的数字经济与5G市场研究报告》。报告指出&#xff0c;随着5G商用的发展&#xff0c;5G对经济社会的影响逐步显现&#xff0c;其影响突出体现在对数字产业发展的带动上。随着5G应用的不断创新与扩散&#xff0c…

网络公开课1

网络公开课1 概念* 常见面试题 输入URL发生哪些事 https http1.0 2.0的区别…… OSI七层模型 协议DNS 传输层 三次握手 四次挥手 http 物理层&#xff1a;并不是指光纤电缆那些&#xff0c;那些是设备。只关心如何传输数据&#xff0c;传输的是比特流 0 1。 应用层&#xff1a;…

汇编物理地址计算与段地址认识

1.物理地址概念: 所有内存单元构造的存储空间是一个一维性空间.每个内存单元在这个空间都有一个唯一的地址,这个唯一的地址称为物理地址. CPU通过地址总线送入存储器的必须是一个内存单元的物理地址. 不同的CPU有不同形式的物理地址形成方式. 物理地址计算公式: 物理地址 …

微服务的演变史(单体式、分布式、SOA架构、微服务架构)

单体式架构 从架构层面来考虑:一个应用只部署一个服务,或该应用由多个服务组成的时候,只部署在一台服务器上 把一种系统的所有功能全部耦合在一个应用中的框架方式 这种开发方式简单,但是只适合体量较小的业务,一旦业务体量增加到一定程度的时候,单机的硬件资源将没办法满足…

JOSEF约瑟 JDL-1001A 电流继电器 导轨式安装 批发价格

名称&#xff1a;电流继电器品牌&#xff1a;JOSEF约瑟型号&#xff1a;JDL-1001A触点容量&#xff1a;250V2A整定范围&#xff1a;0.03-9.99A返回系数&#xff1a;≥0.9特点&#xff1a;交直流两用、消耗小、返回系数高。 型号说明 JD L -1 XXX X/ XXX / XXX 系列型号 JDL…

首发Yolov5/Yolov7优化:Adam该换了!斯坦福最新Sophia优化器,比Adam快2倍 | 2023.5月斯坦福最新成果

1.Sophia优化器介绍 斯坦福2023.5月发表的最新研究成果,他们提出了「一种叫Sophia的优化器,相比Adam,它在LLM上能够快2倍,可以大幅降低训练成本」。 论文:https://arxiv.org/pdf/2305.14342.pdf 本文介绍了一种新的模型预训练优化器:Sophia(Second-order Clippe…

vue2_模版语法

目录 模版语法 react用jsx语法编译后的null作用 插值表达式{{}} v-bind和{{}} 关于国内谷歌自带翻译停用如何解决&#xff08;额外&#xff09; 会一点的插值表达式&#xff0c;也有限制 模版语法 更接近原生js的写法jsx语法 jsx是react提出的&#xff1b;后很多前端框架…

LeetCode 周赛 347(2023/05/28)二维空间上的 LIS 最长递增子序列问题

本文已收录到 AndroidFamily&#xff0c;技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 提问。 往期回顾&#xff1a;LeetCode 单周赛第 346 场 仅 68 人 AK 的最短路问题 周赛 347 概览 T1. 移除字符串中的尾随零&#xff08;Easy&#xff09; 标签&#xff1a;模拟、…

HTTP协议深入理解+如何使用Fiddler抓包

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE初阶 目录 文章目录 一、HTTP概述 1.1 什么是HTTP 1.2 理解应用层协议 二、抓包工具fiddler的使用 2.1 几个需要注意的点 2.2 fiddler的原理 2.3 fiddler的使用技巧 三、HTTP请求&#xff08;Re…

intel驱动程序和支持助理常见问题:不识别、无法检测等问题解决方法

起因&#xff1a; wifi驱动有点问题&#xff0c;于是想着更新一下官方的驱动&#xff0c;下载intel驱动程序和支持助理并安装完成后&#xff0c;打开成了这个样子&#xff0c;刷新多少次都没有用&#xff0c;就是不识别。 解决方法&#xff1a; 经过一波胡乱操作&#xff0…

华为OD机试之真正的密码(Java源码)

真正的密码 题目描述 一行中输入一个字符串数组&#xff0c;如果其中一个字符串的所有以索引0开头的子串在数组中都有&#xff0c;那么这个字符串就是潜在密码在所有潜在密码中最长的是真正的密码&#xff0c;如果有多个长度相同的真正的密码&#xff0c;那么取字典序最大的为…

使用CompletionService进行多个文件打包为zip下载

最近没怎么写博客了&#xff0c;因为前段时间在准备软考复习&#xff0c;昨天考完试&#xff0c;现在总算轻松一点了&#xff0c;有更多自由的时间了&#xff0c;总结一下JUC包下的一些并发工具类&#xff0c;主要是从使用场景入手。 CompletionService可以用于实现任务并行化…

数据结构入门(C语言版)图的概念和功能函数实现

图的概念和功能函数实现 前言1.图的定义和术语1.1 定义1.2 常用术语 2.图的存储结构2.1 图的数组(邻接矩阵)存储表示2.2 图的邻接表存储表示 3.图的遍历3.1 深度优先搜索3.2 广度优先搜索3.3 示例 4.连通网的最小生成树4.1 克鲁斯卡尔(Kruskal)算法4.2 普里姆(Prim)算法 5.图的…

企业云盘软件世界排行榜:提升企业文件管理效率的最佳工具

企业云盘是一种面向企业用户提供的在线存储和文件分享服务&#xff0c;它能够帮助企业实现数据备份、文件共享、办公协同等多种功能。通过企业云盘&#xff0c;企业可以将数据集中管理&#xff0c;避免了传统存储方式的不便和风险。 企业云盘的优势 1. 集中管理&#xff1a;企业…

【js】对象属性的拦截和Proxy代理与Reflect映射的用法与区别

✍️ 作者简介: 前端新手学习中。 &#x1f482; 作者主页: 作者主页查看更多前端教学 &#x1f393; 专栏分享&#xff1a;css重难点教学 Node.js教学 从头开始学习 ajax学习 文章目录 对象属性的拦截介绍SetGet 对象的拦截介绍使用对象属性拦截和对象拦截区别练习题 映射…

【Python实战】Python采集地震信息

前言 昨天,我们这里发生了地震,不过,没有太大的问题,我就想着能不能把近几年发生地震的信息,收集下来,我们发现中国地震台网的官方微博会分布近几年发生地震的信息。我们可以直接在这里获取。 环境使用 python 3.9pycharm模块使用 requests模块介绍 requests requ…

每日一博 - 浅析事务隔离级别 MVCC机制

文章目录 DB四个隔离级别MVCC如何工作的 &#xff1f;小结 DB四个隔离级别 数据库隔离允许事务执行&#xff0c;就像没有其他并发运行的事务一样。 下面的图说明了四个隔离级别。 Serializalble: 这是最高的隔离级别。并发交易保证按顺序执行。Repeatable Read: 事务开始时读…

Flutter 笔记 | Flutter 事件与通知

原始指针事件处理 命中测试 在移动端&#xff0c;各个平台或UI系统的原始指针事件模型基本都是一致&#xff0c;即&#xff1a;一次完整的事件分为三个阶段&#xff1a;手指按下、手指移动、和手指抬起&#xff0c;而更高级别的手势&#xff08;如点击、双击、拖动等&#xf…