数据结构——循环队列(数组)

一、循环队列的定义

二、循环队列图示

 

三、循环队列使用规则 

为解决队满和队空的判断条件相同。

我们 采用  损失一个单元不用的方法

即当循环队列元素的个数是MAXSIZE-1时,就认为队列已满(front指向空的单元)

这样循环队列的队满条件就变成 :

(rear+1)%MAXSIZE==front

循环队列的队空条件依旧是:

front==rear

 

四、循环队列的代码 

#define MAXSIZE 4     typedef int DataType;
typedef struct
{DataType data[MAXSIZE];  //实际上只能存MAXSIZE-1 个数据int front;int rear;
}SeqQueue;//损失一个单元不用,即当循环队列中元素个数是MAXSIZE-1时,就认为队列已经满了
//front指向那个不使用的单元
//循环队列的队满的条件就是(rear+1)%MAXSIZE==front
//队空的条件是  front==rear//初始化队列
void InitQueue(SeqQueue* Q)//初始化队列函数
{Q->front = Q->rear = 0;//指针初始化
}//判断是否为空
int  EmptyQueue(SeqQueue* Q)//判断队空函数
{if (Q->front == Q->rear)//队列为空return 1;elsereturn 0;
}//判断是否为满
int  FullQueue(SeqQueue* Q)//判断队满函数
{if (Q->front == (Q->rear + 1) % MAXSIZE)//队尾指针加上1,再取余MAXSIZE的值如果等于队头指针,说明队列为满return 1;elsereturn 0;
}//入队操作
void InQueue(SeqQueue* Q, DataType x)//入队函数
{if (FullQueue(Q)){printf("队列已满,无法继续入队\n");return;}else{Q->rear = (Q->rear + 1) % MAXSIZE;//更新队尾指针rear,队尾指针加1再取余MAXSIZE,将数组形成一个循环Q->data[Q->rear] = x;//将入队的数据放到队列数组,更新后的rear所指向的位置}
}//出队操作
void DeQueue(SeqQueue* Q)//出队函数
{if (EmptyQueue(Q)){printf("队列已空,无法继续出队\n");return;}else{Q->front = (Q->front + 1) % MAXSIZE; //更新队头指针front, 队头指针加1再取余MAXSIZE, 将数组形成一个循环}
}//取队头操作
DataType GetFront(SeqQueue* Q)//取队头函数
{if (EmptyQueue(Q)){printf("队列已空,无队头元素\n");return 0;}else{int t;  //因为front指向的位置无元素,队头元素在front指向的后一位t = (Q->front + 1) % MAXSIZE; //将 队头指针加1再取余MAXSIZE 的值赋给treturn Q->data[t]; //返回数组中下标为t的元素}
}void ShowQueue(SeqQueue* Q)//显示队中元素函数
{int p = Q->front;if (p == Q->rear)printf("队列为空,无元素!\n");else{printf("\n从队头起队列中的个元素为:");while (p != Q->rear){printf("%5d", Q->data[(p + 1) % MAXSIZE]);p++;        p %= MAXSIZE; //使得p能从数组的首位地址重新遍历,形成循环,打印出所有的数组元素}}
}

五、循环队列的函数使用

1.入队函数:InQueue

int main()
{SeqQueue SQ;InitQueue(&SQ);//初始化InQueue(&SQ, 3);//入队InQueue(&SQ, 4);//入队InQueue(&SQ, 5);//入队//插入3次,满了InQueue(&SQ, 5);//第四次插入不了ShowQueue(&SQ);//打印数组中所有的值return 0;
}

 结果:

插入3次,满了。第四次插入不了

 

 2.取队头函数GetFront

int main()
{SeqQueue SQ;InitQueue(&SQ);//初始化InQueue(&SQ, 3);//入队InQueue(&SQ, 4);//入队InQueue(&SQ, 5);//入队//插入3次,满了printf("循环队列中的元素依次是:");ShowQueue(&SQ);//打印数组中所有的值printf("\n");DataType x = GetFront(&SQ);//取队头元素printf("\n队头元素是:%d \n", x);return 0;
}

结果:

 

3.出队函数DeQueue

int main()
{SeqQueue SQ;InitQueue(&SQ);//初始化InQueue(&SQ, 3);//入队InQueue(&SQ, 4);//入队InQueue(&SQ, 5);//入队//插入3次,满了printf("循环队列中的元素依次是:");ShowQueue(&SQ);//打印数组中所有的值printf("\n\n");DeQueue(&SQ);//出队一次InQueue(&SQ,99);//出队之后,再入队一次printf("操作后循环队列中的元素依次是:");ShowQueue(&SQ);//打印数组中所有的值return 0;
}

结果;

出队之后,再入队一次,打印新的循环队列

六、心得体会

  1. 队列是一种运算受限制的线性表,插入在队尾,删除在队头。
  2. 队列的逻辑结构和线性表也相同,数据元素之间存在一对一的关系,它的主要特性是先进先出
  3. 循环队列是队列的一种顺序表示和实现方法。与顺序栈类似,在队列的顺序存储结构中,用一组地址连续的存储单元依次存放从队头到队尾的元素。
  4. 由于队列中队头和队尾的位置都是动态变化的,因此需要附设两个指针front和rear,分别知识队头元素和队尾元素在数组中的位置。
  5. 普通的顺序队列会有假溢出,一个巧妙的办法就是将顺序队列的数组看成一个环状的空间,即规定最后一个单元的后继为第一个单元,我们形象地称之为循环队列。

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AVL树的完全指南:平衡与性能

文章目录 AVL树简介AVL的操作建立一个AVL树插入操作删除操作 书写代码1.构造函数和析构函数2.获取最大值和最小值3.树的高度和节点个数3.前序中序和后序遍历4.判断树是否为空树5.四个旋转操作6.获取平衡因子7.插入操作8.删除操作9.搜索节点.h文件中的定义 总结 AVL树简介 AVL树…

WWW服务器搭建(1)——HTTP协议原理篇

目录 一、WWW的相关概念 1.1 WWW的定义 1.2 超文本标记语言HTML 1.3 统一资源定位符URL 1.4 超文本传输协议HTTP 二、HTTP协议工作过程 2.1 DNS解析 2.2 TCP连接过程 2.3 HTTP 请求与响应 2.4 TCP连接断开 三、HTTP请求报文格式 3.1 请求行 3.2 请求头 3.3 空行 …

windows和Linux卸载移动磁盘

文章目录 Linux卸载磁盘target is busy.window卸载磁盘打开事件查看器 Linux卸载磁盘target is busy. #查看有哪些进程访问挂载点 lsof /media/lei/repository/#杀死进程 pkill node window卸载磁盘 #提示 #该设备正在使用中. 请关闭可能使用该设备的所有程序或窗口,然后重试…

大厂Java面试题:MyBatis中是如何实现动态SQL的?有哪些动态SQL元素(标签)?描述下动态SQL的实现原理。

大家好,我是王有志。 今天给大家带来的是一道来自京东的 MyBatis 面试题:MyBatis 中是如何实现动态 SQL 的?有哪些动态 SQL 元素(标签)?描述下动态 SQL 的实现原理。 MyBatis 中提供了 7 个动态 SQL 语句…

【循环程序设计-谭浩强适配】(适合专升本、考研)

无偿分享学习资料,需要的小伙伴评论区或私信dd。。。 无偿分享学习资料,需要的小伙伴评论区或私信dd。。。 无偿分享学习资料,需要的小伙伴评论区或私信dd。。。 完整资料如下:纯干货、纯干货、纯干货!!…

DIFT:Emergent Correspondence from Image Diffusion # 论文阅读

URL https://arxiv.org/pdf/2306.03881 主页:https://diffusionfeatures.github.io/ 代码:https://github.com/Tsingularity/dift TD;DR 23 年 6月 cornell 大学的文章,任务是做图片的特征匹配(关联),特…

004.可观察对象与观察者

Rx非常适合事件驱动的应用程序。这是有意义的,因为事件(作为)(如前所述)是创建时变值的命令式方法。从历史上看,事件驱动编程主要出现在客户端技术中,因为作为事件实现的用户交互。例如,你可能工作过使用OnMouseMove或OnKeyPressed事件。正因…

大模型时代下两种few shot高效文本分类方法

介绍近年(2022、2024)大语言模型盛行下的两篇文本分类相关的论文,适用场景为few shot。两种方法分别是setfit和fastfit,都提供了python的包使用方便。 论文1:Efficient Few-Shot Learning Without Prompts 题目:无需提示的高效少…

C语言——模拟实现库函数atoi

1. atoi atoi&#xff1a;将字符串转换为整数。 1. 头文件 <string.h> 2. 声明&#xff1a; 1. 如果字符串开始有空格&#xff0c;直接跳过。 2. - 会影响打印的数字的正负。 3. 只打印数字字符&#xff0c;遇到非数字字符就停止。 4. 如果转换之后的数字大于 …

开眼了,自动化测试还能这样用?

持续集成的自动化测试通常需要将代码、测试用例与持续集成工具进行绑定&#xff0c;以实现自动运行。然而&#xff0c;Apipost的自动化测试功能需要手动操作&#xff0c;并且需要手动查看测试结果。 为了解决这个问题&#xff0c;Apipost推出了持续集成功能&#xff0c;方便同…

2025考研 | 北京师范大学计算机考研考情分析

北京师范大学&#xff08;Beijing Normal University&#xff09;简称“北师大”&#xff0c;由中华人民共和国教育部直属&#xff0c;中央直管副部级建制&#xff0c;位列“211工程”、“985工程”&#xff0c;入选国家“双一流”、“珠峰计划”、“2011计划”、“111计划”、…

从“金事通”带给我意想不到的来说--“数据是架构的中心”

背景 上周一个保险的销售人员来找我完成一定的售后流程。其中有一项是请我下载一个叫 金事通的 APP。说实在的我根本没听过。她说这是政治任务。我想不是有你们保险公司的APP了嘛。为什么还要我安装。没办法先安装吧。 经历了注册、人脸识别的步骤后。可以登录了。注册短信发…