一、题目链接:. - 力扣(LeetCode)
二、循环队列使用的方法
如图所示:
为解决队满和队空的判断条件相同。
我们 采用 损失一个单元不用的方法 (front指向空的单元)
即当循环队列元素的个数是MAXSIZE-1时,就认为队列已满
这样循环队列的队满条件就变成 :
(rear+1)%MAXSIZE==front
循环队列的队空条件依旧是:
front==rear
可参考文章:https://blog.csdn.net/babilunlaobanjiu/article/details/138816761
三、题解代码
typedef struct {
int *data; //实际上只能存MAXSIZE-1 个数据
int front;
int rear;
int k;//循环队列数组的长度
} MyCircularQueue;
//函数声明
MyCircularQueue* myCircularQueueCreate(int k);
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value);
bool myCircularQueueDeQueue(MyCircularQueue* obj);
int myCircularQueueFront(MyCircularQueue* obj);
int myCircularQueueRear(MyCircularQueue* obj);
bool myCircularQueueIsEmpty(MyCircularQueue* obj);
bool myCircularQueueIsFull(MyCircularQueue* obj);
void myCircularQueueFree(MyCircularQueue* obj);
//初始化
MyCircularQueue* myCircularQueueCreate(int k) {
MyCircularQueue* obj = (MyCircularQueue * )malloc(sizeof(MyCircularQueue));
if (obj == NULL)
{
perror("malloc fail");
return NULL;
}
obj->front = 0;
obj->rear = 0;
obj->k = k;
int* p = (int*)malloc(sizeof(int) * (k+1));
if (p == NULL)
{
perror("malloc fail");
return NULL;
}
obj->data = p;
return obj;//申请的空间,出了这个函数并不会消失
}
//入队
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
if (myCircularQueueIsFull(obj))//如果满
{
return false;
}
else //如果非满
{
obj->rear = (obj->rear + 1) % (obj->k+1);
obj->data[obj->rear] = value;
return true;
}
}
//出队
bool myCircularQueueDeQueue(MyCircularQueue* obj) {
if (myCircularQueueIsEmpty(obj))//如果空
{
return false;
}
else //如果非空
{
obj->front = (obj->front + 1) % (obj->k+1);
return true;
}
}
//取队头元素
int myCircularQueueFront(MyCircularQueue* obj) {
if (myCircularQueueIsEmpty(obj) ) //如果空
{
return -1;
}
else //如果非空
{
int temp = (obj->front + 1) % (obj->k+1);
return obj->data[temp];
}
}
//取队尾元素
int myCircularQueueRear(MyCircularQueue* obj) {
if (myCircularQueueIsEmpty(obj)) //如果空
return -1;
else //如果非空
return obj->data[obj->rear];
}
//判断队列是否为空
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
if (obj->front == obj->rear)//队列为空
return true;
else
return false;
}
//判断队列是否为满
bool myCircularQueueIsFull(MyCircularQueue* obj) {
if (obj->front == (obj->rear + 1) %(obj->k+1))//队尾指针加上1,再取余MAXSIZE的值如果等于队头指针,说明队列为满
return true;
else
return false;
}
//销毁队列
void myCircularQueueFree(MyCircularQueue* obj) {
free(obj->data);
obj->front = obj->rear = 0;
}
/**
* 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);
*/
四、循环队列的注意要素
要实现循环队列,一定是空间有限并且固定的数组,每次队头下标front 和 队尾下标 rear 的变化,都有 取余 循环队列数组的长度,从而让它形成一个循环的效果。