题目描述:
力扣:622. 设计循环队列
解题思路:
1.本题可以用数组和链表解决,但是数组更加方便,更加高效,所以选择数组进行实现本题;
2.添加rear
和front
用来判断何时为空,什么时候为满,显然当rear=front
为空,rear+1=front
为满
3.注意边界问题,这里采用%(K+1)
来控制边界问题
typedef struct {
int* a;
int front;
int rear;
int k;
} MyCircularQueue;
//创建+初始化
MyCircularQueue* myCircularQueueCreate(int k)
{
MyCircularQueue* obj=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));
obj->a=(int*)malloc(sizeof(int)*(k+1));
obj->front=obj->rear=0;
obj->k=k;
return obj;
}
//跟上边思路一样,判断是否为空
bool myCircularQueueIsEmpty(MyCircularQueue* obj)
{
return obj->front==obj->rear;
}
//跟上边思路一样,判断是否为满
bool myCircularQueueIsFull(MyCircularQueue* obj)
{
return (obj->rear+1)%(obj->k+1)==obj->front;
}
//添加一个新元素
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value)
{
//如果满了,所以就要return false
if(myCircularQueueIsFull(obj))
{
return false;
}
//控制边界+添加新元素
obj->a[obj->rear++]=value;
obj->rear%=(obj->k+1);
return true;
}
bool myCircularQueueDeQueue(MyCircularQueue* obj)
{
if(myCircularQueueIsEmpty(obj)) return false;
++obj->front;
obj->front%=(obj->k+1);
return true;
}
int myCircularQueueFront(MyCircularQueue* obj)
{
if(myCircularQueueIsEmpty(obj)) return -1;
else return obj->a[obj->front];
}
int myCircularQueueRear(MyCircularQueue* obj)
{
if(myCircularQueueIsEmpty(obj)) return -1;
else return obj->a[(obj->rear-1+obj->k+1)%(obj->k+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);
*/