任丘市做网站,如何建三网合一网站,变色龙app制作教程,门户类网站是什么意思题目描述
题目链接#xff1a;622. 设计循环队列 - 力扣#xff08;LeetCode#xff09; 题目分析 我们开辟空间的时候多开一个#xff0c;k是队列的长度#xff0c;我们开k1个空间#xff0c;定义一个front指向头#xff0c;back的下一个指向尾
当frontback的时候622. 设计循环队列 - 力扣LeetCode 题目分析 我们开辟空间的时候多开一个k是队列的长度我们开k1个空间定义一个front指向头back的下一个指向尾
当frontback的时候队列为空当back1%kfront的时候队列为满
这个多开的空间是移动的出队列的时候front移动入队列的时候back移动当队列满的时候back1%k一定front
具体过程如下 具体的接口有下面几个
创建队列
用结构体封装一个数组一个front和back一个长度k来表示队列 初始化
给队列开辟一块空间给数组开辟k1个空间开始队列为空front和back都为0 判空
frontback就为空 判满
当back1%kfront的时候队列为满 插入
如果队列满了直接返回false如果不为满则插入到back位置然后back到后一个位置指向尾的下一个
当backk1的时候back回到数组第一个位置即backback%k1
一个数模一个比他大的数不会改变这个值 删除
因为只有front到back之间的值是有效的所以删除直接让front往后走就行
如果队列空了直接返回false如果不为空则front返回true
同样当frontk1的时候也需要回到数组第一个位置即frontfront%k1 返回队头队尾的值
back指向队尾的下一个所以返回队尾数据的时候返回的是k-1
如果back指向的是数组第一个则返回数组的最后一个值即a[k]
如果队列为空则返回-1 销毁 队列的有效数据个数
现有一循环队列其队头为front队尾为rear(rear指向队尾数据的下一个位置)循环队列长度为N,最多存储N-1个数据其有效长度为(rear - front N) % N
有效长度一般是rear-front, 但是循环队列中rear有可能小于front减完之后可能是负数所以需要N此时结果刚好是队列中有效元素个数但如果rear大于front减完之后就是有效元素个数了再加N后有效长度会超过N故需要%N。
代码示例
typedef struct {int *a;int front;int back;int k;
} MyCircularQueue;MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue* obj(MyCircularQueue* )malloc(sizeof(MyCircularQueue));obj-a(int *)malloc(sizeof(int)*(k1));obj-front0;obj-back0;obj-kk;return obj;
}
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return obj-frontobj-back;
}bool myCircularQueueIsFull(MyCircularQueue* obj) {return (obj-back1)%(obj-k1)obj-front;
}bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {if(myCircularQueueIsFull(obj))return false;obj-a[obj-back]value;obj-back;obj-back%(obj-k1);return true;
}bool myCircularQueueDeQueue(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return false;obj-front;obj-front%(obj-k1);return true;
}int myCircularQueueFront(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return -1;return obj-a[obj-front];
}int myCircularQueueRear(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return -1;if(obj-back0)return obj-a[obj-k];elsereturn obj-a[obj-back-1];
}void myCircularQueueFree(MyCircularQueue* obj) {free(obj-a);free(obj);}/*** Your MyCircularQueue struct will be instantiated and called as such:* MyCircularQueue* obj myCircularQueueCreate(k);* bool param_1 myCircularQueueEnQueue(obj, value);* bool param_2 myCircularQueueDeQueue(obj);* int param_3 myCircularQueueFront(obj);* int param_4 myCircularQueueRear(obj);* bool param_5 myCircularQueueIsEmpty(obj);* bool param_6 myCircularQueueIsFull(obj);* myCircularQueueFree(obj);
*/