循环队列
使用一个size标志来表示当前队列有多少个元素
当 size = 0 //表示空队列
当 size = 队列长度 //表示满队列
typedef struct {
int front; //第一个元素位置
int rear; //最后一个元素下一个位置
int size; //当前元素个数
int k; //容量
int* array;
} MyCircularQueue;
MyCircularQueue* myCircularQueueCreate(int k) {
MyCircularQueue* mq = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
mq->array = (int*)malloc(sizeof(int) * k);
mq->front = 0;
mq->rear = 0;
mq->size = 0;
mq->k = k;
return mq;
}
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
if(obj->size == obj->k){
return false;
}
//尾插
obj->array[obj->rear++] = value;
//循环的标志
if(obj->rear == obj->k){
obj->rear = 0;
}
obj->size++;
return true;
}
bool myCircularQueueDeQueue(MyCircularQueue* obj) {
if(obj->size == 0){
return false;
}
//头删
++obj->front;
//保证循环
if(obj->front == obj->k){
obj->front = 0;
}
obj->size--;
return true;
}
int myCircularQueueFront(MyCircularQueue* obj) {
if(obj->size == 0){
return -1;
}
return obj->array[obj->front];
}
int myCircularQueueRear(MyCircularQueue* obj) {
if(obj->size == 0){
return -1;
}
if(obj->rear == 0){
return obj->array[obj->k - 1];
}
return obj->array[obj->rear - 1];
}
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
if(obj->size == 0){
return true;
}
return false;
}
bool myCircularQueueIsFull(MyCircularQueue* obj) {
if(obj->size == obj->k){
return true;
}
return false;
}
void myCircularQueueFree(MyCircularQueue* obj) {
free(obj->array);
free(obj);
}
方式2:
不使用size,就指向头的指针 front 跟指向尾的指针 rear。
当 front == rear 时 代表空
当 (rear + 1)% 队列总长度 == front 时 代表满
typedef struct {
int front; //第一个元素位置
int rear; //最后一个元素位置
int k; //容量
int* array;
} MyCircularQueue;
MyCircularQueue* myCircularQueueCreate(int k) {
MyCircularQueue* mq = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
mq->array = (int*)malloc(sizeof(int) * k + 1);
mq->front = 0;
mq->rear = 0;
mq->k = k;
return mq;
}
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
if ((obj->rear+1) % (obj->k + 1) == obj->front) {
return false;
}
//尾插
obj->array[obj->rear++] = value;
//循环的标志
if (obj->rear == obj->k + 1) {
obj->rear = 0;
}
return true;
}
bool myCircularQueueDeQueue(MyCircularQueue* obj) {
if (obj->front == obj->rear) {
return false;
}
//头删
++obj->front;
//保证循环
if (obj->front == obj->k + 1) {
obj->front = 0;
}
return true;
}
int myCircularQueueFront(MyCircularQueue* obj) {
if (obj->front == obj->rear) {
return -1;
}
return obj->array[obj->front];
}
int myCircularQueueRear(MyCircularQueue* obj) {
if (obj->front == obj->rear) {
return -1;
}
if (obj->rear == 0) {
return obj->array[obj->k];
}
return obj->array[obj->rear - 1];
}
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
if (obj->front == obj->rear) {
return true;
}
return false;
}
bool myCircularQueueIsFull(MyCircularQueue* obj) {
if ((obj->rear + 1) % (obj->k + 1) == obj->front) {
return true;
}
return false;
}
void myCircularQueueFree(MyCircularQueue* obj) {
free(obj->array);
free(obj);
}