当前位置:网站首页>leetcode622.设计循环队列(C语言)
leetcode622.设计循环队列(C语言)
2022-07-01 13:42:00 【Brant_zero】

目录
一、题目链接和介绍
实现一个循环的队列,其特性队列的先进先出(FIFO)原则,队尾被连接在队首之后以形成一个循环,该题目即为实现其功能。
二、大体思路
①创建一个大小为k+1的数组。使用head和tail两个变量来记录数组中数据的变化;
②存入数据时,tail指针向后移动;删除数据时,head指针向前移动。
③因为要存放k个数据,我们开辟k+1的空间的目的就是防止存入数据时发生了覆盖,当tail+1==head时即表示队列存满。
三、具体步骤
3.1 创建结构体
有一个head变量表示队列的头,tail表示队列的尾,k表示存入队列的大小,a开辟的数组。
typedef struct {
int *a;
int k;
int head;
int tail;
} MyCircularQueue;3.2 队列的创建
因为结构体不好控制,而且下面题目的函数形参都是以结构体指针的形式传入,所以我们要初始创建时要使用结构体变量obj来控制。
又因为函数作用域的原因,所以我们创建该结构体时要使用malloc来开辟,这样函数销毁的时候我们创建的变量才不会被销毁,并且可以成功返回该结构体指针。
MyCircularQueue* myCircularQueueCreate(int k) {
//控制该结构体(MyCircularQueue)的指针
MyCircularQueue* obj=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));
//开辟k+1的数组空间
obj->a=(int*)malloc(sizeof(int)*(k+1));
obj->head=0;
obj->tail=0;
obj->k=k;
return obj;
}3.3 队列的插入
我们的思路是,将数据插入到 a[tail] 的位置,然后使 tail++ ,这样就可以数据插入到队列中去。
这里有一个问题,因为我们是循环队列,如果出现这种情况:
head因为删除数据导致前移,然后插入数据时tail走出了数组。

所以这时我们要判断,如果当tail==k+1时,我们就要让tail回归到对头。
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
//如果队列未满,直接返回false,插入失败
if(myCircularQueueIsFull(obj))
return false;
obj->a[obj->tail]=value;
obj->tail++;
//obj->tail%=(k+1)
if (obj->tail==obj->k+1)
{
obj->tail=0;
}
return true;
}3.4删除数据
想删除数据,只用将head向前移动一格即可。当然,也可能出现以下这种情况。

所以我们同样可以判断,当head==k+1时,我们将head移动到对头。
bool myCircularQueueDeQueue(MyCircularQueue* obj) {
if (myCircularQueueIsEmpty(obj))
return false;
++obj->head;
if (obj->head==obj->k+1)
{
obj->head=0;
}
return true;
}3.5 队列的判空
我们的思路是,队列初始状态下head和tail都存的是同一个下标,即head==tail==0,且我们规定了tail+1==head才是存满的,所以说只有当head和tail相等时队列才为空
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
return obj->head==obj->tail;
}3.6 队列的判满
以下我们有两种形式判定队列的为满的情况

二:
我们先来看第二种情况,设置一个临时变量temp为tail+1,如果tamp==head就表示队列当前为满返回true。
第一种情况,设置一个临时变量temp为tail+1,如果temp==k+1,将temp置为0,再判断tamp是否等于head,如果等于,就表示为满,返回true。
bool myCircularQueueIsFull(MyCircularQueue* obj) {
int next=obj->tail+1;
//实际是再判断tail是否位于数组最后。
if (next==obj->k+1)
next=0;
return next==obj->head;
}3.7 队列头部数据
这就很简单了,直接返回head下标处的数据即可。
int myCircularQueueFront(MyCircularQueue* obj) {
if (myCircularQueueIsEmpty(obj))
return -1;
else
return obj->a[obj->head];
}3.8 队列尾部数据
这里又分两种情况:①tail未被置0 ②tail被置零。

如果tail被置零,因为在程序的开始,我们就判断了队列是否为空,所以k位置处肯定是有数据的,我们直接返回k下标处的数据即可。
int myCircularQueueRear(MyCircularQueue* obj) {
if (myCircularQueueIsEmpty(obj))
return -1;
if (obj->tail==0)
{
return obj->a[obj->k];
}
//return obj->a[(obj->tail+k)%(k+1)]
return obj->a[obj->tail-1];
}3.9 队列的销毁

我们首先要释放数组a,再释放队列。
void myCircularQueueFree(MyCircularQueue* obj) {
free(obj->a);
free(obj);
}四、代码部分
//使用数组实现
typedef struct {
int *a;
int k;
int head;
int tail;
} MyCircularQueue;
MyCircularQueue* myCircularQueueCreate(int k) {
MyCircularQueue* obj=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));
//开辟k+1的空间
obj->a=(int*)malloc(sizeof(int)*(k+1));
obj->head=0;
obj->tail=0;
obj->k=k;
return obj;
}
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
return obj->head==obj->tail;
}
bool myCircularQueueIsFull(MyCircularQueue* obj) {
int next=obj->tail+1;
if (next==obj->k+1)
next=0;
return next==obj->head;
}
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
if(myCircularQueueIsFull(obj))
return false;
obj->a[obj->tail]=value;
obj->tail++;
//obj->tail%=(k+1)
if (obj->tail==obj->k+1)
{
obj->tail=0;
}
return true;
}
bool myCircularQueueDeQueue(MyCircularQueue* obj) {
if (myCircularQueueIsEmpty(obj))
return false;
++obj->head;
if (obj->head==obj->k+1)
{
obj->head=0;
}
return true;
}
int myCircularQueueFront(MyCircularQueue* obj) {
if (myCircularQueueIsEmpty(obj))
return -1;
else
return obj->a[obj->head];
}
int myCircularQueueRear(MyCircularQueue* obj) {
if (myCircularQueueIsEmpty(obj))
return -1;
if (obj->tail==0)
{
return obj->a[obj->k];
}
//return obj->a[(obj->tail+k)%(k+1)]
return obj->a[obj->tail-1];
}
void myCircularQueueFree(MyCircularQueue* obj) {
free(obj->a);
free(obj);
}边栏推荐
- 机器学习总结(一):线性回归、岭回归、Lasso回归
- Kongsong (Xintong Institute) - cloud security capacity building and trend in the digital era
- 2022年PMP项目管理考试敏捷知识点(6)
- Machine learning summary (I): linear regression, ridge regression, Lasso regression
- [Jianzhi offer] 55 - ii balanced binary tree
- 洞态在某互联⽹⾦融科技企业的最佳落地实践
- String input function
- [machine learning] VAE variational self encoder learning notes
- Understand the window query function of tdengine in one article
- 9. Use of better scroll and ref
猜你喜欢

洞态在某互联⽹⾦融科技企业的最佳落地实践

焱融看 | 混合云时代下,如何制定多云策略

IO的几种模型 阻塞,非阻塞,io多路复用,信号驱动和异步io

进入前六!博云在中国云管理软件市场销量排行持续上升

AnimeSR:可学习的降质算子与新的真实世界动漫VSR数据集

清华章毓晋老师新书:2D视觉系统和图像技术(文末送5本)

Several models of IO blocking, non blocking, IO multiplexing, signal driven and asynchronous IO

Interpretation of R & D effectiveness measurement framework

Kongsong (Xintong Institute) - cloud security capacity building and trend in the digital era

Etcd 概要 机制 和使用场景
随机推荐
1. Sum of two numbers: given an integer array num and an integer target value, please find the two integers whose sum is the target value target in the array and return their array subscripts
arthas使用
Several models of IO blocking, non blocking, IO multiplexing, signal driven and asynchronous IO
Leetcode question 1: sum of two numbers (3 languages)
Chen Yu (Aqua) - Safety - & gt; Cloud Security - & gt; Multicloud security
Uni app realizes advertisement scroll bar
Flutter SQLite使用
20个实用的 TypeScript 单行代码汇总
MySQL 66 questions, 20000 words + 50 pictures in detail! Necessary for review
leetcode 322. Coin change (medium)
Report on the current situation and development trend of bidirectional polypropylene composite film industry in the world and China Ⓟ 2022 ~ 2028
机器学习总结(一):线性回归、岭回归、Lasso回归
What is the future development direction of people with ordinary education, appearance and family background? The career planning after 00 has been made clear
【NLP】预训练模型——GPT1
Flow management technology
Arthas use
Google Earth Engine(GEE)——全球人类居住区网格数据 1975-1990-2000-2014 (P2016)
Summary of interview questions (1) HTTPS man in the middle attack, the principle of concurrenthashmap, serialVersionUID constant, redis single thread,
QT社团管理系统
8款最佳实践,保护你的 IaC 安全!