C语言数据结构——环形队列
队列都有两个指针,分别指向队头和队尾,用于出队入队
这里使用顺序表来实现队列,设置头元素下标为front,指向队头,尾元素下标为rear,指向队尾的下一个节点。之所以不选择链表,是因为链表不便于查找队尾元素。要用链表实现也可以,但要么需要记录rear的前一个节点,要么就让rear指向队尾,在入队时插入rear->next
想要实现环形队列的难点在于如何实现循环和如何判空和判满
1.实现循环
顺序表采用对rear和front取模的方式,每次出队入队都分别front++和rear++,当front和rear超过队列最大容量capacity时,让他们%capacity,这样就实现了循环
2.判空判满
如果一个可放入n个数据的环形队列的capacity为n的话,一开始front == rear == 0,假设不入队一直出队,当队满时rear又循环到了0下标,此时front == rear == 0仍成立。
这里有两种方法实现判空判满,第一种是设置size位,当size==0为空,size==capacity为满,但是每次更改front和rear时都需要更改size,虽然逻辑简单但是操作繁琐;第二种是多开辟一个位置,当front == rear为空,当(rear+1)%(capacity+1)== front则为满
为什么是(rear+1)%(capacity+1)== front?
首先,rear需要通过+1来判断是否等于front
其次,假设capacity为4,那实际数组空间为5,下标为0,1,2,3,4,当rear==4,此时下标0,1,2,3中都有数据,rear的理论最大值为rear+1 == 5,要使rear+1 == 5 == 0就需要使5%5,如此%的右边就为rear的理论最大值,front同理
typedef struct {int* arr;//arr下标int front;int rear;//可存放元素个数int capacity;} MyCircularQueue;MyCircularQueue* myCircularQueueCreate(int k) {//动态开辟结构体MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));//设置容量obj->capacity = k;//动态开辟结构体中的数组,多开一个空间用于判满obj->arr = (int*)malloc(sizeof(int)*(obj->capacity+1));obj->front = obj->rear = 0;return obj;
}bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return obj->front == obj->rear;}bool myCircularQueueIsFull(MyCircularQueue* obj) {return (obj->rear+1)%(obj->capacity+1) == obj->front;
}bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {//当队列不满才插入if(!myCircularQueueIsFull(obj)){obj->arr[obj->rear] = value;obj->rear = (obj->rear+1)%(obj->capacity+1);return true;}else{return false;}
}bool myCircularQueueDeQueue(MyCircularQueue* obj) {//当队列不为空才删除if(!myCircularQueueIsEmpty(obj)){obj->front = (obj->front+1)%(obj->capacity+1);return true;}else{return false;}
}int myCircularQueueFront(MyCircularQueue* obj) {//当队列不为空获取,队为空返回-1if(!myCircularQueueIsEmpty(obj)){return obj->arr[obj->front];}else{return -1;}
}int myCircularQueueRear(MyCircularQueue* obj) {//当队列不为空获取,队为空返回-1if(!myCircularQueueIsEmpty(obj)){return obj->arr[(obj->rear+obj->capacity)%(obj->capacity+1)];}else{return -1;}
}void myCircularQueueFree(MyCircularQueue* obj) {free(obj->arr);free(obj);
}
C语言数据结构——环形队列相关推荐
- 数据结构环形队列学习(c语言)
数据结构环形队列学习(c语言) 实现效果 效果模型描述 代码设置队列长度为5,数组实际大小为6(队列长度加1) 黄色方格是队列头,灰色是未被使用内存,蓝色是队列元素 Example1: 当队列添加满元 ...
- 数据结构——环形队列的原理(模拟环形队列)
数据结构--环形队列的原理(模拟环形队列) 知识点简要介绍: 队列:一种特殊的线性表,包含队列头.队列尾,只允许在队列头进行删除操作,在队列为进行删除操作 分类: 顺序队列.循环队列(环形队列 ...
- c语言数据结构之队列
前言 不同于栈,队列是一个先进先出的数据结构,规定数据节点从队列尾插入,从队列头取出,禁止对头尾两端以外的数据进行操作.队列可以分为顺序队列和循环队列. C语言数据结构之单链表 C语言数据结构之双向链 ...
- 数据结构--环形队列的介绍与实现
数据结构--环形队列实现 一.环形队列实现原理 环形队列的几个判断条件 二.代码实现 1.环形队列类(CircleQueue) 2.环形队列类测试类 3.程序运行结果 4.完整代码 环形队列可以用数组 ...
- C语言实现环形队列基本操作
C语言实现环形队列基本操作(以简单排队问题为例) 通过调用简单函数实现顺序表的相关操作.代码编译环境为VS2019 16.9.4.因为VS的某些原因,scanf写为了scanf_s,作用是一样的,在其 ...
- 数据结构-环形队列 C和C++的实现
队列: 含义:是一种先入先出(FIFO)的数据结构. 当我们把数据一个一个放入队列中.当我们需要用到这些数据时,每次都从队列的头部取出第一个数据进行处理.就像排队进场一样,先排队的人先进场. 结构如下 ...
- c语言环形队列用法,C语言,环形队列
什么是环形队列? 环形缓冲区是一个非常典型的数据结构,这种数据结构符合生产者,消费者模型,可以理解它是一个水坑,生产者不断的往里面灌水,消费者就不断的从里面取出水. 那就可能会有人问,既然需要灌水,又 ...
- GO语言数据结构之队列
https://www.cnblogs.com/zly-go/p/15472059.html 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端进行删除操作,而在表的后端进行插入操作,和栈一样,队 ...
- 数据结构 - 环形队列
关注 "弋凡"(YiFan)微信公众号吧 记录简单笔记 做你的最爱 环形队列图 思路: 1,front变量,初始值为 0,指向队列的第一个元素也是待取出的数据, 也就是说arr[f ...
最新文章
- ISE和Modelsim联合仿真
- 在ORACLE中对存储过程加密
- Linux/Unix环境下的make和makefile详解
- 处理业务代码中循环遍历出现的性能问题
- innodb_flush_log_at_trx_commit
- gitlab project项目迁移
- thymeleaf中的th:assert用法
- Android SDK开发包下载地址
- 关于Mysql8.0.26版本与IDEA连接的配置
- MarkDown 的两种页内跳转方法!!!!!
- MTOM以及在WCF中的应用
- aspupload上传中文文件名乱码解决方法
- egret引擎生命周期相关
- 【马三北漂记】之终章
- macos 10.15 软件损坏/无法验证开发者
- SurfaceView使用日记(二)--实例:绘画板
- SCSI总线和协议以及SAN存储网络详解
- dwz 表单提交 html,dwz 文件上传表单提交 分析
- 使用SET修改组合SAS数据集
- 华为手机,果然有顶级的产品经理 —— 手机克隆太好用了
热门文章
- Nginx 之实现原理
- 基于混沌系统的文本加密算法研究(二)——经典混沌映射
- 音频怎么转换文件格式?教你轻松转换
- mmap(内存映射)、sendfile() 与零拷贝技术
- python2.7安装pytorch_Pytorch如何安装,Linux安装Pytorch,OSX安装Pytorch教程
- (一)ArcGIS空间数据的转换与处理——投影变换
- unity调试手机游戏(Android)【模拟器+真机】+设置运行时游戏横屏
- 为什么交叉熵可以用来当损失?与MMD的区别?
- 机器学习——支持向量机——硬间隔与支持向量
- SPI 接口OLED 模块 - 兼容5V 和3.3V 电平