1、定义数据结构 tail head 头尾指针,队列buf queue ,队列长度 size ,已存数据长度 len
typedef struct myQueue{
int* queue;
int head;
int tail;
int size;
int len;
} MyCircularQueue;
2.初始化 数据结构
/** Initialize your data structure here. Set the size of the queue to be k. */
MyCircularQueue* myCircularQueueCreate(int k) {
MyCircularQueue* obj=malloc(sizeof(MyCircularQueue));
obj->queue=malloc(k*sizeof(int));
obj->head=0;
obj->tail=0;
obj->size=k;
obj->len = 0;
return obj;
}
3.如果已存在数据长度为0 则为空
/** Checks whether the circular queue is empty or not. */
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
return (obj->len==0);//&&((obj->queue)[obj->head]==-1);
}
4、如果已存在数据长度等于queue的长度则队列为满
/** Checks whether the circular queue is full or not. */
bool myCircularQueueIsFull(MyCircularQueue* obj) {
return (obj->len==obj->size);
}
5、向尾指针插入数据,尾指针总是指向当前有效数据的下个地址,已存在数据长度加1
/** Insert an element into the circular queue. Return true if the operation is successful. */
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
if(myCircularQueueIsFull(obj)) return false;
(obj->queue)[obj->tail]=value;
obj->tail = (obj->tail + 1 )% obj->size;
obj->len ++;
return true;
}
6、从头指针开始删除队列中元素,已存在数据长度减1,头指针加一
/** Delete an element from the circular queue. Return true if the operation is successful. */
bool myCircularQueueDeQueue(MyCircularQueue* obj) {
if(myCircularQueueIsEmpty(obj)) return false;
obj->head = (obj->head + 1) % obj->size;
obj->len --;
return true;
}
7、获取有效数据第一个元素
/** Get the front item from the queue. */
int myCircularQueueFront(MyCircularQueue* obj) {
if(myCircularQueueIsEmpty(obj)) return -1;
return (obj->queue)[obj->head];
}
8、获取有效数据最后一个元素
/** Get the last item from the queue. */
int myCircularQueueRear(MyCircularQueue* obj) {
if(myCircularQueueIsEmpty(obj)) return -1;
if(obj->tail == 0)
return (obj->queue)[obj->size - 1];
else
return (obj->queue)[obj->tail - 1];
}
9、释放queue
void myCircularQueueFree(MyCircularQueue* obj) {
if(obj&&obj->queue)
{
free(obj->queue);
free(obj);
}
}