// 判空时用 count 记录
typedef struct {
int *pdata;
int head;
int tail;
int size;
int count;
} MyCircularQueue;
MyCircularQueue* myCircularQueueCreate(int k) {
if (k <= 0) {
return NULL;
}
MyCircularQueue* queue = (MyCircularQueue *)malloc(sizeof(MyCircularQueue));
if (!queue) {
return NULL;
}
queue->pdata = (int *)malloc(sizeof(int) * k);
queue->head = 0;
queue->tail = 0;
queue->size = k;
queue->count = 0;
for (int i = 0; i < k; i++) {
queue->pdata[i] = -1;
}
return queue;
}
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
return obj->count == 0;
}
bool myCircularQueueIsFull(MyCircularQueue* obj) {
return obj->count == obj->size;
}
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
if (myCircularQueueIsFull(obj))
return false;
obj->pdata[obj->tail] = value;
obj->tail = (obj->tail + 1) % obj->size;
obj->count++;
return true;
}
bool myCircularQueueDeQueue(MyCircularQueue* obj) {
if (myCircularQueueIsEmpty(obj)) {
return false;
}
obj->pdata[obj->head] = -1;
obj->head = (obj->head + 1) % obj->size;
obj->count--;
return true;
}
int myCircularQueueFront(MyCircularQueue* obj) {
return obj->pdata[(obj->head) % obj->size];
}
int myCircularQueueRear(MyCircularQueue* obj) { // 当队列为空时,取尾结点,tail-1为负,所以加上一个size 长度
return obj->pdata[(obj->tail - 1 + obj->size) % obj->size]; // -1 是因为tail 指向的是该填入的位置
}
void myCircularQueueFree(MyCircularQueue* obj) {
free(obj->pdata);
free(obj);
}
## 不用 count , 就是多申请了一块内存,判空的方式不同,其他的完全一样
MyCircularQueue* myCircularQueueCreate(int k) {
if (k <= 0) {
return NULL;
}
MyCircularQueue* queue = (MyCircularQueue *)malloc(sizeof(MyCircularQueue));
if (!queue) {
return NULL;
}
queue->pdata = (int *)malloc(sizeof(int) * (k + 1));
queue->head = 0;
queue->tail = 0;
queue->size = k + 1;
//queue->count = 0;
for (int i = 0; i < k + 1; i++) {
queue->pdata[i] = -1;
}
return queue;
}
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
return obj->head == obj->tail;
}
bool myCircularQueueIsFull(MyCircularQueue* obj) {
return obj->head == (obj->tail + 1) % obj->size;
}