当前位置:网站首页>leetcode622. Design cycle queue (C language)
leetcode622. Design cycle queue (C language)
2022-07-01 13:53:00 【Brant_ zero】

Catalog
One 、 Topic link and introduction
Two 、 General train of thought
One 、 Topic link and introduction
622. Design loop queue - Power button (LeetCode)
Implement a circular queue , Its characteristics are first in, first out (FIFO) principle , The tail of the team is connected behind the head of the team to form a cycle , This topic is to realize its function .
Two 、 General train of thought
① Create a size of k+1 Array of . Use head and tail Two variables to record the changes of data in the array ;
② When saving data ,tail The pointer moves back ; When deleting data ,head The pointer moves forward .
③ Because it needs to be stored k Data , We open up k+1 The purpose of the space is to prevent overwriting when storing data , When tail+1==head When the queue is full .
3、 ... and 、 Specific steps
3.1 Create structure
There is one head The variable represents the head of the queue ,tail Indicates the end of the queue ,k Indicates the size of the queue ,a Open up an array .
typedef struct {
int *a;
int k;
int head;
int tail;
} MyCircularQueue;
3.2 Queue creation
Because the structure is not easy to control , And the function parameters of the following topics are passed in the form of structure pointers , So we need to use structural variables when we want to initially create obj To control .
And because of the function scope , So when we create this structure, we need to use malloc To open up , In this way, when the function is destroyed, the variables we create will not be destroyed , And can successfully return the structure pointer .
MyCircularQueue* myCircularQueueCreate(int k) {
// Control the structure (MyCircularQueue) The pointer to
MyCircularQueue* obj=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));
// open up k+1 The array space of
obj->a=(int*)malloc(sizeof(int)*(k+1));
obj->head=0;
obj->tail=0;
obj->k=k;
return obj;
}
3.3 Queue insertion
Our thinking is , Insert data into a[tail] The location of , Then make tail++ , In this way, data can be inserted into the queue .
Here's a question , Because we are a circular queue , If that happens :
head Because deleting data leads to moving forward , And then when you insert the data tail Out of Array .
So at this time, we have to judge , If so tail==k+1 when , We are going to let tail Return to the right .
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
// If the queue is not full , Go straight back to false, Insert the failure
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 Delete data
Want to delete data , Only the head Move forward one space . Of course , The following situations may also occur .
So we can also judge , When head==k+1 when , We will head Move to the opposite .
bool myCircularQueueDeQueue(MyCircularQueue* obj) {
if (myCircularQueueIsEmpty(obj))
return false;
++obj->head;
if (obj->head==obj->k+1)
{
obj->head=0;
}
return true;
}
3.5 The queue is empty
Our thinking is , In the initial state of the queue head and tail All save the same subscript , namely head==tail==0, And we stipulated tail+1==head Is full , So only when head and tail The queue is empty only when it is equal
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
return obj->head==obj->tail;
}
3.6 Queue full
Below we have two ways to determine whether the queue is full
Two : Let's take a look at Two In this case , Set a temporary variable temp by tail+1, If tamp==head It means that the queue is currently full and returns true.
The first One In this case , Set a temporary variable temp by tail+1, If temp==k+1, take temp Set as 0, To determine tamp Is it equal to head, If it is equal to , It means full , return true.
bool myCircularQueueIsFull(MyCircularQueue* obj) {
int next=obj->tail+1;
// In fact, it is to judge again tail Whether it is at the end of the array .
if (next==obj->k+1)
next=0;
return next==obj->head;
}
3.7 Queue header data
It's very simple , Go straight back to head The data at the subscript is enough .
int myCircularQueueFront(MyCircularQueue* obj) {
if (myCircularQueueIsEmpty(obj))
return -1;
else
return obj->a[obj->head];
}
3.8 End of queue data
There are two situations here :①tail Not set 0 ②tail Set to zero .
If tail Set to zero , Because at the beginning of the program , We judge whether the queue is empty , therefore k There must be data at the location , We go straight back k The data at the subscript is enough .
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 Destruction of queues
We first release the array a, Then release the queue .
void myCircularQueueFree(MyCircularQueue* obj) {
free(obj->a);
free(obj);
}
Four 、 Code section
// Use arrays to implement
typedef struct {
int *a;
int k;
int head;
int tail;
} MyCircularQueue;
MyCircularQueue* myCircularQueueCreate(int k) {
MyCircularQueue* obj=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));
// open up k+1 Space
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);
}
边栏推荐
猜你喜欢
spark源码(五)DAGScheduler TaskScheduler如何配合提交任务,application、job、stage、taskset、task对应关系是什么?
After being laid off for three months, the interview ran into a wall everywhere, and the mentality has begun to collapse
Explain IO multiplexing, select, poll, epoll in detail
一文读懂TDengine的窗口查询功能
leetcode622.设计循环队列(C语言)
Interpretation of R & D effectiveness measurement framework
App automation testing Kaiyuan platform appium runner
Etcd summary mechanism and usage scenarios
逻辑是个好东西
奔涌而来的数字化浪潮,将怎样颠覆未来?
随机推荐
Solution to 0xc000007b error when running the game [easy to understand]
Explain IO multiplexing, select, poll, epoll in detail
8 best practices to protect your IAC security!
Applet - applet chart Library (F2 chart Library)
玩转MongoDB—搭建MongoDB集群
8 popular recommended style layout
分布式事务简介(seata)
SAP intelligent robot process automation (IRPA) solution sharing
spark源码(五)DAGScheduler TaskScheduler如何配合提交任务,application、job、stage、taskset、task对应关系是什么?
算网融合赋能行业转型,移动云点亮数智未来新路标
El form item regular verification
[flask] flask starts and implements a minimal application based on flask
arthas使用
3.4 data query in introduction to database system - select (single table query, connection query, nested query, set query, multi table query)
二传感器尺寸「建议收藏」
受益互联网出海 汇量科技业绩重回高增长
清华章毓晋老师新书:2D视觉系统和图像技术(文末送5本)
Qtdeisgner, pyuic detailed use tutorial interface and function logic separation (nanny teaching)
运行游戏时出现0xc000007b错误的解决方法[通俗易懂]
【IoT毕设.上】STM32+机智云AIoT+实验室安全监控系统