赞
踩
这是一道Leetcode中一道中等难度的队列题,题名622. 设计循环队列
题目要求:
循环队列(CircularQueue)就是首位相接的队列,有基于数组实现,也有基于链表实现,一般特指基于数组实现的循环队列。在数组的循环队列中,其出队的时间复杂的明显要优于普通的数组队列。其本质上则是通过两个指针,队首指针与队尾指针来实现。这种结构的优势就是开辟有限的空间,却能够反复使用开辟的空间,提高了内存利用率。
循环队列可以使用链表来实现,但一般采用数组来实现循环队列,下面我也将会采用数组来实现循环队列。
先举个例子,假设这个队列最大存储数据的个数为X,那么我们应该创建一个容量为**(X+1)大小的队列。这样做的好处是为了方便我们对队列判空和判满更加方便。
如图:
从图中不难看出,其判断一个循环队列是否为满的条件就是**(tail+1)%(X+1)==head.
让我们再看看判空的条件又是那些,如图:
队列判空条件就是:head等于tail的时候。
现在我们就直接上具体实现的代码:
typedef struct { int* a;//数组 int k;//容量个数 int head;//队头 int tail;//队尾 } MyCircularQueue; MyCircularQueue* myCircularQueueCreate(int k)//循环队列初始化 { MyCircularQueue* newnode = (MyCircularQueue*)malloc(sizeof(MyCircularQueue)); newnode->k = k; newnode->head = 0; newnode->tail = 0; newnode->a = (int*)malloc(sizeof(int)*(1+k));//申请空间K+1 return newnode; } bool myCircularQueueIsEmpty(MyCircularQueue* obj); bool myCircularQueueIsFull(MyCircularQueue* obj); bool myCircularQueueEnQueue(MyCircularQueue* obj, int value)//插入数据 { if(!myCircularQueueIsFull(obj))//队列不为满则插入数据 { obj->a[obj->tail] = value; obj->tail = (obj->tail+1)%(obj->k+1); return true; } return false; } bool myCircularQueueDeQueue(MyCircularQueue* obj)//头删数据 { if(myCircularQueueIsEmpty(obj))//队列不为空才能删除数据 { return false; } obj->head = (obj->head +1)%(obj->k+1); return true; } int myCircularQueueFront(MyCircularQueue* obj)//返回队头数据 { if(myCircularQueueIsEmpty(obj)) { return -1; } 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-1]; } bool myCircularQueueIsEmpty(MyCircularQueue* obj)//判断队列是否为空 { if(obj->tail == obj->head) return true; return false; } bool myCircularQueueIsFull(MyCircularQueue* obj)//判断队列是否为满 { if((obj->tail+1)%(obj->k+1)==obj->head) { return true; } else if(obj->tail==obj->k &&obj->head==0) { return true; } else { return false; } } void myCircularQueueFree(MyCircularQueue* obj)//回收空间 { free(obj->a); free(obj); }
以上就是用C语言实现循环队列的具体方法,希望对大家有所帮助,感谢大家的观看!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。