算法开启循环队列武魂
文章目录
- 设计循环队列
- 题目
- 数组形式(通过下标控制来达到循环的效果)
- 环队结构体(数组)
- 环队初始化
- 判断环队为空
- 判断环队为满
- 环队入数据并入成功返回真
- 环队删数据并删成功返回真
- 环队取队头数据(对空返回-1)
- 环队取队尾数据(对空返回-1)
- 环队销毁
- 环队(数组实现)
- 链表形式
- 环队结构体(链表)
- 环队初始化
- 判断环队为空
- 判断环队为满
- 环队入数据并入成功返回真
- 环队删数据并删成功返回真
- 环队取队头数据(对空返回-1)
- 环队取队尾数据(对空返回-1)
- 环队销毁
- 环队(链表实现)
- 实际上这题我报错我不想找了太恶心了(家凌帮我找错的非常感谢)
设计循环队列
题目
我们会使用一种队列叫循环队列。如操作系统课程讲解生产者消费者模型时可以就会使用循环队列。环形队列可以使用数组实现,也可以使用循环链表实现。
可以认为队尾tail不是队尾,而是我们认知上队尾的后一个
数组形式(通过下标控制来达到循环的效果)
环队结构体(数组)
typedef struct {int* a;int front;int tail;int k;//数组元素(队列长度)
} MyCircularQueue;
环队初始化
MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue* q = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));q->a = (int*)malloc(sizeof(int)*(k+1));//队列长度为k我们要多开一个q->front = q->tail = 0;q->k = k;return q;
}
判断环队为空
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return obj->front == obj->tail;
}
判断环队为满
bool myCircularQueueIsFull(MyCircularQueue* obj) {return (obj->tail+1)%(obj->k+1) == obj->front;
}
环队入数据并入成功返回真
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {if(!myCircularQueueIsFull(obj)){obj->a[obj->tail] = value;//不是队满就下标tail的数据为valueobj->tail++;obj->tail %= obj->k+1;//tail就步进一位return true;}return false;//队满就插不进去了
}
环队删数据并删成功返回真
bool myCircularQueueDeQueue(MyCircularQueue* obj) {if(!myCircularQueueIsEmpty(obj)){obj->front++;//队不空就是出队,头标步进就行了obj->front %= obj->k+1;return true;}return false;//对空就删不了了
}
环队取队头数据(对空返回-1)
int myCircularQueueFront(MyCircularQueue* obj) {if(!myCircularQueueIsEmpty(obj)){return obj->a[obj->front]; //取front位置的数据就行 }return -1;
}
环队取队尾数据(对空返回-1)
int myCircularQueueRear(MyCircularQueue* obj) {if(!myCircularQueueIsEmpty(obj)){ return obj->a[obj->tail == 0 ? obj->k : obj->tail-1];//取tail前一个数据就行,tail为0,前一个就是k位置数据 }return -1;
}
环队销毁
void myCircularQueueFree(MyCircularQueue* obj) {free(obj->a);obj->a = NULL;obj->front = 0;obj->tail = 0;obj->k = 0;free(obj);
}
环队(数组实现)
typedef struct {int* a;int front;int tail;int k;//数组元素(队列长度)
} MyCircularQueue;MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue* q = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));q->a = (int*)malloc(sizeof(int)*(k+1));//队列长度为k我们要多开一个q->front = q->tail = 0;q->k = k;return q;
}bool myCircularQueueIsEmpty(MyCircularQueue* obj);
bool myCircularQueueIsFull(MyCircularQueue* obj);bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {if(!myCircularQueueIsFull(obj)){obj->a[obj->tail] = value;//不是队满就下标tail的数据为valueobj->tail++;obj->tail %= obj->k+1;//tail就步进一位return true;}return false;//队满就插不进去了
}bool myCircularQueueDeQueue(MyCircularQueue* obj) {if(!myCircularQueueIsEmpty(obj)){obj->front++;//队不空就是出队,头标步进就行了obj->front %= obj->k+1;return true;}return false;//对空就删不了了
}int myCircularQueueFront(MyCircularQueue* obj) {if(!myCircularQueueIsEmpty(obj)){return obj->a[obj->front]; //取front位置的数据就行 }return -1;
}int myCircularQueueRear(MyCircularQueue* obj) {if(!myCircularQueueIsEmpty(obj)){ return obj->a[obj->tail == 0 ? obj->k : obj->tail-1];//取tail前一个数据就行,tail为0,前一个就是k位置数据 }return -1;
}bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return obj->front == obj->tail;
}bool myCircularQueueIsFull(MyCircularQueue* obj) {return (obj->tail+1)%(obj->k+1) == obj->front;
}void myCircularQueueFree(MyCircularQueue* obj) {free(obj->a);obj->a = NULL;obj->front = 0;obj->tail = 0;obj->k = 0;free(obj);
}
链表形式
环队结构体(链表)
typedef int CQDataType;//环队数据类型typedef struct CQNode
{CQDataType x;//环队节点数据struct CQNode* next;//环队节点指针
}CQNode;typedef struct {CQNode* head;CQNode* tail;int k;
} MyCircularQueue;//空环队就两个裸指针
环队初始化
MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue* cq = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));CQNode* cur = (CQNode*)malloc(sizeof(CQNode));cq->k = k;cq->head = cq->tail = cur;while(k--){CQNode* newnode = (CQNode*)malloc(sizeof(CQNode));CQNode* tail = cq->tail;//最后一个节点tail->next = newnode;//最后一个节点指向新的节点newnode->next = cq->head;//新的节点指向头节点cq->tail=newnode;}cq->head = cq->tail;return cq;
}
判断环队为空
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {assert(obj->head && obj->tail);return obj->head == obj->tail;
}
判断环队为满
bool myCircularQueueIsFull(MyCircularQueue* obj) {assert(obj->head && obj->tail);return obj->tail->next == obj->head;
}
环队入数据并入成功返回真
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {assert(obj->head && obj->tail);if(!myCircularQueueIsFull(obj)){obj->tail->x = value;obj->tail = obj->tail->next;return true;}return false;
}
环队删数据并删成功返回真
bool myCircularQueueDeQueue(MyCircularQueue* obj) {assert(obj->head && obj->tail);if(!myCircularQueueIsEmpty(obj)){obj->head = obj->head->next;return true;}return false;
}
环队取队头数据(对空返回-1)
int myCircularQueueFront(MyCircularQueue* obj) {assert(obj->head && obj->tail);if(!myCircularQueueIsEmpty(obj))return obj->head->x;return -1;
}
环队取队尾数据(对空返回-1)
int myCircularQueueRear(MyCircularQueue* obj) {assert(obj->head && obj->tail);if(!myCircularQueueIsEmpty(obj)){CQNode*ret=obj->head;while(ret->next!=obj->tail){ret=ret->next;}return ret->x;}return -1;
}
环队销毁
void myCircularQueueFree(MyCircularQueue* obj) {assert(obj->head && obj->tail);while(obj->head!=obj->tail){CQNode*ret=obj->tail;obj->tail=obj->tail->next;free(ret);}free(obj->head);free(obj);
}
环队(链表实现)
typedef int CQDataType;//环队数据类型typedef struct CQNode
{CQDataType x;//环队节点数据struct CQNode* next;//环队节点指针
}CQNode;typedef struct {CQNode* head;CQNode* tail;int k;
} MyCircularQueue;//空环队就两个裸指针bool myCircularQueueIsEmpty(MyCircularQueue* obj);
bool myCircularQueueIsFull(MyCircularQueue* obj);MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue* cq = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));CQNode* cur = (CQNode*)malloc(sizeof(CQNode));cq->k = k;cq->head = cq->tail = cur;while(k--){CQNode* newnode = (CQNode*)malloc(sizeof(CQNode));CQNode* tail = cq->tail;//最后一个节点tail->next = newnode;//最后一个节点指向新的节点newnode->next = cq->head;//新的节点指向头节点cq->tail=newnode;}cq->head = cq->tail;return cq;
}bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {assert(obj->head && obj->tail);if(!myCircularQueueIsFull(obj)){obj->tail->x = value;obj->tail = obj->tail->next;return true;}return false;
}bool myCircularQueueDeQueue(MyCircularQueue* obj) {assert(obj->head && obj->tail);if(!myCircularQueueIsEmpty(obj)){obj->head = obj->head->next;return true;}return false;
}int myCircularQueueFront(MyCircularQueue* obj) {assert(obj->head && obj->tail);if(!myCircularQueueIsEmpty(obj))return obj->head->x;return -1;
}/*int myCircularQueueRear(MyCircularQueue* obj) {assert(obj->head && obj->tail);if(!myCircularQueueIsEmpty(obj)){CQNode* ret = obj->head;//这个ret 是用来找tail前一个的,不可用直接返回tail,会改变原来环队的链接关系while(--obj->k){obj->tail = obj->tail->next;} ret = obj->tail;obj->tail = obj->tail->next;return obj->tail->x;}return -1;
}*/
int myCircularQueueRear(MyCircularQueue* obj) {assert(obj->head && obj->tail);if(!myCircularQueueIsEmpty(obj)){CQNode*ret=obj->head;while(ret->next!=obj->tail){ret=ret->next;}return ret->x;}return -1;
}bool myCircularQueueIsEmpty(MyCircularQueue* obj) {assert(obj->head && obj->tail);return obj->head == obj->tail;
}bool myCircularQueueIsFull(MyCircularQueue* obj) {assert(obj->head && obj->tail);return obj->tail->next == obj->head;
}void myCircularQueueFree(MyCircularQueue* obj) {assert(obj->head && obj->tail);while(obj->head!=obj->tail){CQNode*ret=obj->tail;obj->tail=obj->tail->next;free(ret);}free(obj->head);free(obj);
}
实际上这题我报错我不想找了太恶心了(家凌帮我找错的非常感谢)
算法开启循环队列武魂相关推荐
- 数据结构与算法之循环队列的操作
数据结构与算法之循环队列的操作 /* 循环队列的入队和出队算法设计 初始化循环队列 .打印队列.插入元素到循环队列.获取循环队列的首元素,元素不出队.出队.获取循环队列元素个数.判断循环队列的空和满. ...
- java循环队列入队出队算法_循环队列实现
生活中有很多队列的影子,比如打饭排队,买火车票排队问题等,可以说与时间相关的问题,一般都会涉及到队列问题:从生活中,可以抽象出队列的概念,队列就是一个能够实现"先进先出"的存储结构 ...
- 【数据结构与算法】循环队列和链队列的比较
前言 本文原本是一篇随感+笔记,被翻出来后就整理发了博客. 不曾想能上搜索头条,既如此,决定更新一下,加上必要的阐释,避免影响有需求的读者. (我这么理解大家,如果有需要的话,是不是可以考虑点个赞或者 ...
- 【数据结构与算法】循环队列的Java实现
定义接口 public interface QueueInterface<T> {/*** 入队* 在队尾插入指定数据元素* @param element*/void enQueue(T ...
- 算法开启栈转队列武魂
文章目录 ==**栈接口见 [算法开启小码农栈血脉](https://blog.csdn.net/diandengren/article/details/121055584?spm=1001.2014 ...
- 算法开启队列转栈武魂
文章目录 ==**队列接口见 [算法开启小码农队列血脉](https://blog.csdn.net/diandengren/article/details/121072953?spm=1001.20 ...
- 【Java 数据结构 算法】宁可累死自己, 也要卷死别人 6 循环队列
[Java 数据结构 & 算法]⚠️宁可累死自己, 也要卷死别人 6⚠️ 循环队列 概述 循环队列 循环队列实现 改变队列大小 enqueue 方法 dequeue 方法 main 完整代码 ...
- 数据结构与算法(3-2)队列(顺序队列、循环队列与链队列)
目录 一.顺序队列 1.存储结构 2.入队和出队 总代码 二.循环队列 总代码: 三.链队列 1.存储结构 2.入队和出队 总代码 一.顺序队列 队列特征:先进后出.后进后出. 1.存储结构 //队列 ...
- 循环队列,定义循环队列长度为10,编写初始化队列、入队、出队、求队长,实现10,20,30,40,50,60,70,80入队,10,20,30出队,56,67入队的算法功能。
循环队列,定义循环队列长度为10,编写初始化队列.入队.出队.求队长,实现10,20,30,40,50,60,70,80入队,10,20,30出队,56,67入队的算法功能. #include< ...
最新文章
- MyEclipse+Tomcat部署发布webapp
- tkinter学习系列之(五)Checkbutton控件
- 【计算机网络】传输层 : TCP 拥塞控制 ( 慢开始 | 拥塞避免 | 快重传 | 快恢复 )
- 区块链预言机(4)内在机制
- SpringCloud教程- 路由网关Zuul (SpringCloud版本Greenwich.SR4)
- 欧盟通过最新《数据保护法》
- mysql安装过程-zip安装
- 多线程中对全局变量(整型类型)是否需要同步操作
- jvm lock低性能分析
- 手把手教你使用 VuePress 搭建个人博客
- 荐号 | “看一看”中“偷”来的很棒的公众号
- 计算机网络布线开题报告,网络综合布线开题报告.docx
- 异步IO实现和应用场景
- 【1】星空派GD32F303开发板介绍
- 基于AT89C51单片机的超声波传感器测距【程序详细代码及注释】
- Android 指纹验证
- Spatial Pyramid Pooling
- html markdown插件,MarkDown编辑必备插件
- NYOJ268 荷兰国旗问题
- Ubuntu 下 Pytorch, Tensorflow 对应的Python、英伟达显卡驱动、CUDA、CUDNN版本与环境信息查看方法
热门文章
- android生成将布局生成海报保存并分享
- Python全栈开发-Mysql知识点总结(中)
- 电源平面Z阻抗参数的提取是否需要设置VRM,以及Port 参考阻抗对仿真结果的影响
- 假如你有超能力,会复活哪部经典美剧?
- vue-cli创建项目,webpack运行时在 95% emitting CompressionPlugin卡住不动
- Huffman Tree
- 伤害世界怎么自建服务器,《伤害世界Hurtworld》服务器架设方法图文详解 怎么开服?...
- 科学防疫宣传实践总结报告
- 计算机信息管理参考文献,计算机信息管理本科论文参考文献大全 计算机信息管理本科论文参考文献哪里找...
- 那曲虫草价目表2022