题目
力扣链接
![image-20211118224229920](https://img-blog.csdnimg.cn/img_convert/0ed894645ed45487e47e01099409e379.png)
链表循环队列
思路
![image-20211119113821536](https://img-blog.csdnimg.cn/img_convert/687660946a3f2b20a4756de000a49784.png)
代码
typedef int QDateType;
typedef struct node
{
QDateType x;
struct node* next;
}Queuenode;
typedef struct {
Queuenode*head;
Queuenode*front;
Queuenode*tail;
} MyCircularQueue;
Queuenode* newnode()
{
Queuenode* q = (Queuenode*)malloc(sizeof(Queuenode));
if(q==NULL)
{
perror("q");
exit(-1);
}
q->x = 0;
q->next = NULL;
return q;
}
void QueueDestroy(Queuenode* q)
{
assert(q);
Queuenode* cur = q;
while (cur->next!=q)
{
Queuenode* tmp = cur->next;
free(cur);
cur = tmp;
}
}
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
assert(obj);
return obj->front==obj->tail;
}
bool myCircularQueueIsFull(MyCircularQueue* obj) {
assert(obj);
return obj->tail->next==obj->front;
}
MyCircularQueue* myCircularQueueCreate(int k) {
if (k == 0)
{
return NULL;
}
MyCircularQueue* mycircularqueue = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
if (mycircularqueue == NULL)
{
printf("mycircularqueue==NULL\n");
exit(-1);
}
mycircularqueue->head = NULL;
mycircularqueue->front = NULL;
mycircularqueue->tail = NULL;
Queuenode* Sl = NULL;
while (k > 0)
{
if (Sl == NULL)
{
Queuenode* tmp = newnode();
Sl = tmp;
mycircularqueue->head = tmp;
mycircularqueue->front = tmp;
mycircularqueue->tail = tmp;
}
else
{
Queuenode* tmp = newnode();
Sl->next = tmp;
Sl = tmp;
}
--k;
}
Queuenode* tmp = newnode();
Sl->next = tmp;
tmp->next = mycircularqueue->head;
return mycircularqueue;
}
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
assert(obj);
if(!myCircularQueueIsFull(obj))
{
obj->tail->x=value;
obj->tail=obj->tail->next;
return true;
}
else
{
return false;
}
}
bool myCircularQueueDeQueue(MyCircularQueue* obj) {
assert(obj);
if(myCircularQueueIsEmpty(obj))
{
return false;
}else
{
obj->front=obj->front->next;
return true;
}
}
int myCircularQueueFront(MyCircularQueue* obj) {
assert(obj);
if(myCircularQueueIsEmpty(obj))
{
return -1;
}else
{
return obj->front->x;
}
}
int myCircularQueueRear(MyCircularQueue* obj) {
assert(obj);
if(myCircularQueueIsEmpty(obj))
{
return -1;
}else
{
Queuenode *cur=obj->front;
while(cur->next!=obj->tail)
{
cur=cur->next;
}
return cur->x;
}
}
void myCircularQueueFree(MyCircularQueue* obj) {
assert(obj);
QueueDestroy(obj->head);
obj->head=NULL;
obj->front=NULL;
obj->tail=NULL;
}
数组循环队列
思路
![image-20211119120955326](https://img-blog.csdnimg.cn/img_convert/b2f879c987c15526c3190d268dfabb66.png)
代码
typedef struct {
int *arr;
int sz;
int front ;
int tail;
} MyCircularQueue;
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
assert(obj);
return obj->front==obj->tail;
}
bool myCircularQueueIsFull(MyCircularQueue* obj) {
assert(obj);
return (obj->tail+1)%(obj->sz+1)==obj->front;
}
MyCircularQueue* myCircularQueueCreate(int k) {
MyCircularQueue* mycircularqueue=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));
if(mycircularqueue==NULL)
{
printf("mycircularqueue==NULL\n");
exit(-1);
}
int *ARR=(int *)malloc(sizeof(int)*(k+1));
if(ARR==NULL)
{
printf("ARR==NULL\n");
exit(-1);
}
mycircularqueue->arr=ARR;
mycircularqueue->front=0;
mycircularqueue->tail=0;
mycircularqueue->sz=k;
return mycircularqueue;
}
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
assert(obj);
if(!myCircularQueueIsFull(obj))
{
obj->arr[obj->tail]=value;
obj->tail=(obj->tail+1)%(obj->sz+1);
return true ;
}else
{
return false;
}
}
bool myCircularQueueDeQueue(MyCircularQueue* obj) {
assert(obj);
if(!myCircularQueueIsEmpty(obj))
{
obj->front=(obj->front+1)%(obj->sz+1);
return true;
}else
{
return false;
}
}
int myCircularQueueFront(MyCircularQueue* obj) {
assert(obj);
if(!myCircularQueueIsEmpty(obj))
{
return obj->arr[obj->front];
}else
{
return -1;
}
}
int myCircularQueueRear(MyCircularQueue* obj) {
assert(obj);
if(!myCircularQueueIsEmpty(obj))
{
return obj->arr[(obj->tail+obj->sz)%(obj->sz+1)];
}else
{
return -1;
}
}
void myCircularQueueFree(MyCircularQueue* obj) {
assert(obj);
free(obj->arr);
obj->arr=NULL;
obj->front=0;
obj->tail=0;
obj->sz=0;
free(obj);
}