队列都有两个指针,分别指向队头和队尾,用于出队入队

这里使用顺序表来实现队列,设置头元素下标为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语言数据结构——环形队列相关推荐

  1. 数据结构环形队列学习(c语言)

    数据结构环形队列学习(c语言) 实现效果 效果模型描述 代码设置队列长度为5,数组实际大小为6(队列长度加1) 黄色方格是队列头,灰色是未被使用内存,蓝色是队列元素 Example1: 当队列添加满元 ...

  2. 数据结构——环形队列的原理(模拟环形队列)

    数据结构--环形队列的原理(模拟环形队列) 知识点简要介绍: 队列:一种特殊的线性表,包含队列头.队列尾,只允许在队列头进行删除操作,在队列为进行删除操作 分类:     顺序队列.循环队列(环形队列 ...

  3. c语言数据结构之队列

    前言 不同于栈,队列是一个先进先出的数据结构,规定数据节点从队列尾插入,从队列头取出,禁止对头尾两端以外的数据进行操作.队列可以分为顺序队列和循环队列. C语言数据结构之单链表 C语言数据结构之双向链 ...

  4. 数据结构--环形队列的介绍与实现

    数据结构--环形队列实现 一.环形队列实现原理 环形队列的几个判断条件 二.代码实现 1.环形队列类(CircleQueue) 2.环形队列类测试类 3.程序运行结果 4.完整代码 环形队列可以用数组 ...

  5. C语言实现环形队列基本操作

    C语言实现环形队列基本操作(以简单排队问题为例) 通过调用简单函数实现顺序表的相关操作.代码编译环境为VS2019 16.9.4.因为VS的某些原因,scanf写为了scanf_s,作用是一样的,在其 ...

  6. 数据结构-环形队列 C和C++的实现

    队列: 含义:是一种先入先出(FIFO)的数据结构. 当我们把数据一个一个放入队列中.当我们需要用到这些数据时,每次都从队列的头部取出第一个数据进行处理.就像排队进场一样,先排队的人先进场. 结构如下 ...

  7. c语言环形队列用法,C语言,环形队列

    什么是环形队列? 环形缓冲区是一个非常典型的数据结构,这种数据结构符合生产者,消费者模型,可以理解它是一个水坑,生产者不断的往里面灌水,消费者就不断的从里面取出水. 那就可能会有人问,既然需要灌水,又 ...

  8. GO语言数据结构之队列

    https://www.cnblogs.com/zly-go/p/15472059.html 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端进行删除操作,而在表的后端进行插入操作,和栈一样,队 ...

  9. 数据结构 - 环形队列

    关注 "弋凡"(YiFan)微信公众号吧 记录简单笔记 做你的最爱 环形队列图 思路: 1,front变量,初始值为 0,指向队列的第一个元素也是待取出的数据, 也就是说arr[f ...

最新文章

  1. ISE和Modelsim联合仿真
  2. 在ORACLE中对存储过程加密
  3. Linux/Unix环境下的make和makefile详解
  4. 处理业务代码中循环遍历出现的性能问题
  5. innodb_flush_log_at_trx_commit
  6. gitlab project项目迁移
  7. thymeleaf中的th:assert用法
  8. Android SDK开发包下载地址
  9. 关于Mysql8.0.26版本与IDEA连接的配置
  10. MarkDown 的两种页内跳转方法!!!!!
  11. MTOM以及在WCF中的应用
  12. aspupload上传中文文件名乱码解决方法
  13. egret引擎生命周期相关
  14. 【马三北漂记】之终章
  15. macos 10.15 软件损坏/无法验证开发者
  16. SurfaceView使用日记(二)--实例:绘画板
  17. SCSI总线和协议以及SAN存储网络详解
  18. dwz 表单提交 html,dwz 文件上传表单提交 分析
  19. 使用SET修改组合SAS数据集
  20. 华为手机,果然有顶级的产品经理 —— 手机克隆太好用了

热门文章

  1. Nginx 之实现原理
  2. 基于混沌系统的文本加密算法研究(二)——经典混沌映射
  3. 音频怎么转换文件格式?教你轻松转换
  4. mmap(内存映射)、sendfile() 与零拷贝技术
  5. python2.7安装pytorch_Pytorch如何安装,Linux安装Pytorch,OSX安装Pytorch教程
  6. (一)ArcGIS空间数据的转换与处理——投影变换
  7. unity调试手机游戏(Android)【模拟器+真机】+设置运行时游戏横屏
  8. 为什么交叉熵可以用来当损失?与MMD的区别?
  9. 机器学习——支持向量机——硬间隔与支持向量
  10. SPI 接口OLED 模块 - 兼容5V 和3.3V 电平