1、
在设计循环队列的时候想明白是用链表还是数组,队列是用链表实现,但是循环队列有个缺陷就是不知道尾结点的前一个,然而数组就可以结点这种麻烦,直接是导出尾结点的下标的前一个就行了。所以这里的循环队列我们用数组来实现。
一、先typedef循环队列的化结构体
二、队列的创建
三、插入数据
四、删除数据
五、取队头数据
六、取队尾数据
七、判断是否为空
八、判断是否满了
九、销毁队列
完整代码:
typedef struct {
int *a;
int k;
int tail;
int head;
} MyCircularQueue;
MyCircularQueue* myCircularQueueCreate(int k) {
MyCircularQueue*obj=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));
//创建obj里面数组的空间
obj->a=malloc(sizeof(int)*(k+1));//开大一个
obj->tail=obj->head=0;//下边为0
obj->k=k;//元素个数
return obj;//将obj返回
}
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
return obj->head==obj->tail;
}
bool myCircularQueueIsFull(MyCircularQueue* obj) {
int next=obj->tail+1;
if(next==obj->k+1)
next=0;
return next==obj->head;
}
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
//先判断一下内存是否已经满了
if(myCircularQueueIsFull(obj))
return false;//如果满了就返回flase
obj->a[obj->tail]=value;
obj->tail++;
if(obj->tail==obj->k+1)
obj->tail=0;
return true;//插入成功返回true
}
bool myCircularQueueDeQueue(MyCircularQueue* obj) {
//先判断是否为空
if(myCircularQueueIsEmpty(obj))
return false;//
++obj->head;
if(obj->head==obj->k+1)
obj->head=0;
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;
int prev=obj->tail-1;//尾下边的前一个
if(obj->tail==0)
prev=obj->k;
return obj->a[prev];
}
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);
*/
如有错误!多多指教!