文章目录

  • 设计循环队列
    • 题目
    • 数组形式(通过下标控制来达到循环的效果)
        • 环队结构体(数组)
        • 环队初始化
        • 判断环队为空
        • 判断环队为满
        • 环队入数据并入成功返回真
        • 环队删数据并删成功返回真
      • 环队取队头数据(对空返回-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);
}

实际上这题我报错我不想找了太恶心了(家凌帮我找错的非常感谢)

算法开启循环队列武魂相关推荐

  1. 数据结构与算法之循环队列的操作

    数据结构与算法之循环队列的操作 /* 循环队列的入队和出队算法设计 初始化循环队列 .打印队列.插入元素到循环队列.获取循环队列的首元素,元素不出队.出队.获取循环队列元素个数.判断循环队列的空和满. ...

  2. java循环队列入队出队算法_循环队列实现

    生活中有很多队列的影子,比如打饭排队,买火车票排队问题等,可以说与时间相关的问题,一般都会涉及到队列问题:从生活中,可以抽象出队列的概念,队列就是一个能够实现"先进先出"的存储结构 ...

  3. 【数据结构与算法】循环队列和链队列的比较

    前言 本文原本是一篇随感+笔记,被翻出来后就整理发了博客. 不曾想能上搜索头条,既如此,决定更新一下,加上必要的阐释,避免影响有需求的读者. (我这么理解大家,如果有需要的话,是不是可以考虑点个赞或者 ...

  4. 【数据结构与算法】循环队列的Java实现

    定义接口 public interface QueueInterface<T> {/*** 入队* 在队尾插入指定数据元素* @param element*/void enQueue(T ...

  5. 算法开启栈转队列武魂

    文章目录 ==**栈接口见 [算法开启小码农栈血脉](https://blog.csdn.net/diandengren/article/details/121055584?spm=1001.2014 ...

  6. 算法开启队列转栈武魂

    文章目录 ==**队列接口见 [算法开启小码农队列血脉](https://blog.csdn.net/diandengren/article/details/121072953?spm=1001.20 ...

  7. 【Java 数据结构 算法】宁可累死自己, 也要卷死别人 6 循环队列

    [Java 数据结构 & 算法]⚠️宁可累死自己, 也要卷死别人 6⚠️ 循环队列 概述 循环队列 循环队列实现 改变队列大小 enqueue 方法 dequeue 方法 main 完整代码 ...

  8. 数据结构与算法(3-2)队列(顺序队列、循环队列与链队列)

    目录 一.顺序队列 1.存储结构 2.入队和出队 总代码 二.循环队列 总代码: 三.链队列 1.存储结构 2.入队和出队 总代码 一.顺序队列 队列特征:先进后出.后进后出. 1.存储结构 //队列 ...

  9. 循环队列,定义循环队列长度为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< ...

最新文章

  1. MyEclipse+Tomcat部署发布webapp
  2. tkinter学习系列之(五)Checkbutton控件
  3. 【计算机网络】传输层 : TCP 拥塞控制 ( 慢开始 | 拥塞避免 | 快重传 | 快恢复 )
  4. 区块链预言机(4)内在机制
  5. SpringCloud教程- 路由网关Zuul (SpringCloud版本Greenwich.SR4)
  6. 欧盟通过最新《数据保护法》
  7. mysql安装过程-zip安装
  8. 多线程中对全局变量(整型类型)是否需要同步操作
  9. jvm lock低性能分析
  10. 手把手教你使用 VuePress 搭建个人博客
  11. 荐号 | “看一看”中“偷”来的很棒的公众号
  12. 计算机网络布线开题报告,网络综合布线开题报告.docx
  13. 异步IO实现和应用场景
  14. 【1】星空派GD32F303开发板介绍
  15. 基于AT89C51单片机的超声波传感器测距【程序详细代码及注释】
  16. Android 指纹验证
  17. Spatial Pyramid Pooling
  18. html markdown插件,MarkDown编辑必备插件
  19. NYOJ268 荷兰国旗问题
  20. Ubuntu 下 Pytorch, Tensorflow 对应的Python、英伟达显卡驱动、CUDA、CUDNN版本与环境信息查看方法

热门文章

  1. android生成将布局生成海报保存并分享
  2. Python全栈开发-Mysql知识点总结(中)
  3. 电源平面Z阻抗参数的提取是否需要设置VRM,以及Port 参考阻抗对仿真结果的影响
  4. 假如你有超能力,会复活哪部经典美剧?
  5. vue-cli创建项目,webpack运行时在 95% emitting CompressionPlugin卡住不动
  6. Huffman Tree
  7. 伤害世界怎么自建服务器,《伤害世界Hurtworld》服务器架设方法图文详解 怎么开服?...
  8. 科学防疫宣传实践总结报告
  9. 计算机信息管理参考文献,计算机信息管理本科论文参考文献大全 计算机信息管理本科论文参考文献哪里找...
  10. 那曲虫草价目表2022