当前位置: 首页 > news >正文

LeetCode—设计循环队列(两种方法)

1.题目 

2.思路一(数组)

通过数组进行模拟,通过操作数组的索引构建一个虚拟的首尾相连的环。再循环队列结构中,设置一个队首head和队尾tail,数组的大小固定为k。

初步分析:存在缺陷

改善假溢出问题:

(1) 用size记录数组长度

(2) 多开辟一块空间

 这里,我们选择方案二解决:

 我们对取尾进行分析:

3参考代码(数组解决)

typedef struct {int* a;int head;//头下标int tail;//尾的下一个的下标int k;
} MyCircularQueue;MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));//多开一个空间解决假溢出问题obj->a = malloc(sizeof(int)*(k +1));obj->head = obj->tail = 0;obj->k = k;return obj;
}//判空
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return obj->head == obj->tail;
}
//判满
bool myCircularQueueIsFull(MyCircularQueue* obj) {//模(K+1)解决回绕的问题return (obj->tail + 1)%(obj->k + 1) == obj->head;
} //入队列
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {if(myCircularQueueIsFull(obj))return false;//没满obj->a[obj->tail] = value;obj->tail++;//解决回绕的问题obj->tail %= (obj->k + 1);return true;
}
//出队列
bool myCircularQueueDeQueue(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return false;else{++obj->head;//解决回绕问题obj->head %= (obj->k + 1);return true;}
}
//取头
int myCircularQueueFront(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return -1;elsereturn obj->a[obj->head];
}
//取尾
int myCircularQueueRear(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return -1;else{//1//return obj->tail == 0 ? obj->a[obj->k] : obj->a[obj->tail - 1];     //2//return obj->a[((obj->tail -1) +(obj->k + 1))%(obj->k + 1)]//简化后return obj->a[(obj->tail + obj->k )%(obj->k + 1)];}}void myCircularQueueFree(MyCircularQueue* obj) {free(obj->a);free(obj);
}

 4.思路二(链表)

 用单链表实现队列较为简单,入队列时,将新的元素尾插插入到链表的尾部;出队列时,将链表的都节点返回,并将头指针指向下一个节点。

创建循环队列

head:链表的头结点,队列的头结点

tail:链表的尾节点,队列的尾节点

capacity:队列的容量

size:队列当前元素的数量

//创建循环队列
typedef struct {struct ListNode* head;//队列头节点struct ListNode* tail;//队列尾节点int capacity;//队列容量int size;//队列当前元素数量
} MyCircularQueue;

5.参考代码(链表解决)

//创建循环队列
typedef struct {struct ListNode* head;//队列头节点struct ListNode* tail;//队列尾节点int capacity;//队列容量int size;//队列当前元素数量
} MyCircularQueue;//初始化
MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));obj->capacity = k;obj->size = 0;obj->head = obj->tail = NULL;return obj;
}
//入队列
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {if(obj->capacity == obj->size)return false;//创建新节点struct ListNode* newnode = (struct ListNode*)malloc(sizeof(struct ListNode));newnode->val = value;newnode->next = NULL;if(!obj->head)//空链表{obj->head = obj->tail = newnode;}else//非空链表,尾插{obj->tail->next = newnode;obj->tail = newnode;}obj->size++;return true;
}
//出队列(先入先出)
bool myCircularQueueDeQueue(MyCircularQueue* obj) {if(obj->size == 0)return false;struct ListNode* node = obj->head;obj->head = obj->head->next;obj->size--;free(node);return true;
}
//返回队首元素
int myCircularQueueFront(MyCircularQueue* obj) {if(obj->size == 0)return -1;return obj->head->val;
}
//返回队尾元素
int myCircularQueueRear(MyCircularQueue* obj) {if(obj->size == 0)return -1;return obj->tail->val;
}
//判空
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return obj->size == 0;
}
//判满
bool myCircularQueueIsFull(MyCircularQueue* obj) {return obj->size == obj->capacity;
}
//销毁队列
void myCircularQueueFree(MyCircularQueue* obj) {//一次销毁节点for(struct ListNode* cur = obj->head;cur;){struct ListNode* node = cur;cur = cur->next;   free(node);}free(obj);
}
http://www.lryc.cn/news/349285.html

相关文章:

  • python “名称空间和作用域” 以及 “模块的导入和使用”
  • Pycharm导入自定义模块报红
  • LLMs之KG-RAG:KG-RAG(基于知识图谱的RAG系统)的简介(可以解决多跳问题/同时支持结构化和非结构化数据查询)、经验技巧、案例应用之详细攻略
  • 综合模型及应用(图论学习总结部分内容)
  • 2025考研专业课、英语、数学、政治视频大全,整理全了!
  • 设计模式之策略模式(一)
  • 常见网络攻击及解决方案
  • 【挑战30天首通《谷粒商城》】-【第一天】【10 番外篇】 解决docker 仓库无法访问 + MobaXterm连接VirtualBox虚拟机
  • 【C++】每日一题 17 电话号码的字母组合
  • vue预览PDF文件的几种方法
  • 深度学习入门到放弃系列 - 阿里云人工智能平台PAI部署开源大模型chatglm3
  • GPT-4o,AI实时视频通话丝滑如人类,Plus功能免费可用
  • 【优选算法】——Leetcode——202—— 快乐数
  • 华大基因CEPO-尹烨说学习与生活
  • C#中json数据序列化和反序列化的最简单方法(C#对象和字符串的相互转换)
  • logback 日志脱敏
  • element-ui的表单中,输入框、级联选择器的长度设置
  • 深入了解 npm:Node.js 包管理工具详解
  • 记一次跨域问题
  • 第9章 负载均衡集群日常维护
  • 鸿蒙内核源码分析(消息封装篇) | 剖析LiteIpc(上)进程通讯内容
  • Charger之三动态电源路径管理(DPPM)
  • 大数据模型的选择与安装
  • React 之 lazy(延迟加载)(十七)
  • Node.js -- 会话控制
  • 做抖店不能踩的几个坑,新手要照做,老玩家要听劝~
  • 【Kibana】快速上手Kibana平台(KQL)
  • 全方位入门git-慕课网 笔记
  • 使用 Docker 部署 TaleBook 私人书籍管理系统
  • 分布式系统的一致性与共识算法(一)