当前位置:网站首页>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);
}边栏推荐
- Error:Kotlin: Module was compiled with an incompatible version of Kotlin. The binary version of its
- 【NLP】预训练模型——GPT1
- 基于算力驱动、数据与功能协同的分布式动态(协同)渲染/功能运行时
- 玩转MongoDB—搭建MongoDB集群
- [Jianzhi offer] 54 The k-th node of binary search tree
- Etcd 概要 机制 和使用场景
- App automation testing Kaiyuan platform appium runner
- Fiori applications are shared through the enhancement of adaptation project
- Sign APK with command line
- Spark source code (V) how does dagscheduler taskscheduler cooperate with submitting tasks, and what is the corresponding relationship between application, job, stage, taskset, and task?
猜你喜欢

B站被骂上了热搜。。

Enter the top six! Boyun's sales ranking in China's cloud management software market continues to rise

QT学习管理系统

Build a vc2010 development environment and create a tutorial of "realizing Tetris game in C language"

学会使用LiveData和ViewModel,我相信会让你在写业务时变得轻松

6年技术迭代,阿里全球化出海&合规的挑战和探索

Introduction to distributed transactions (Seata)

【机器学习】VAE变分自编码器学习笔记

QT learning management system

App自动化测试开元平台Appium-runner
随机推荐
清华章毓晋老师新书:2D视觉系统和图像技术(文末送5本)
基于算力驱动、数据与功能协同的分布式动态(协同)渲染/功能运行时
MySQL日志
Word2vec training Chinese word vector
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
新手准备多少钱可以玩期货?农产品可以吗?
Spark source code reading outline
建立自己的网站(21)
Applet - applet chart Library (F2 chart Library)
SAP intelligent robot process automation (IRPA) solution sharing
Animesr: learnable degradation operator and new real world animation VSR dataset
QT learning management system
队列的基本操作(C语言实现)
Error:Kotlin: Module was compiled with an incompatible version of Kotlin. The binary version of its
uni-app实现广告滚动条
C语言基础知识
Journal MySQL
Enter the top six! Boyun's sales ranking in China's cloud management software market continues to rise
被裁三个月,面试到处碰壁,心态已经开始崩了
Grafana reports an error: error= "failed to send notification to email addresses: [email protected] : 535 Error: