C循环队列
1.C文件
#include <malloc.h>
#define T int
CircularQueue* CircularQueueCreate(T Number) {
CircularQueue* obj = (CircularQueue*)malloc(sizeof(CircularQueue));
obj->Queue = (T*)malloc(sizeof(T) * (Number + 1));
obj->head = 0;
obj->tail = 0;
obj->Number = Number;
return obj;
}
char CircularQueueIsEmpty(CircularQueue* obj) {
return obj->head == obj->tail;
}
char CircularQueueIsFull(CircularQueue* obj) {
return (obj->tail + 1) % (obj->Number + 1) == obj->head; //因为上方开了k+1个空间,若为(obj->tail)%(obj->k),
//则第k位置放不了数据,所以需要+1取模,确保第k位能放入
}
char CircularQueueEnQueue(CircularQueue* obj, T value) {
if (CircularQueueIsFull(obj))
return 0;
obj->Queue[obj->tail] = value;
obj->tail++;
if (obj->tail == obj->Number + 1)
obj->tail = 0;
return 1;
}
char CircularQueueDeQueue(CircularQueue* obj) {
if (CircularQueueIsEmpty(obj))
return 0;
++obj->head;//++head
if (obj->head == obj->Number + 1)
obj->head = 0;
return 1;
}
T CircularQueueFront(CircularQueue* obj) {
if (CircularQueueIsEmpty(obj))
return -1;
return obj->Queue[obj->head];
}
T CircularQueueRear(CircularQueue* obj) {
if (CircularQueueIsEmpty(obj))
return -1;
int pre = obj->tail - 1;
if (obj->tail == 0)
pre = obj->Number;
return obj->Queue[pre];
}
void CircularQueueFree(CircularQueue* obj) {
free(obj->Queue);
obj->Queue = NULL;
obj->head = obj->tail = 0;
}
#undef T
2.头文件
#ifndef __CircularQueue
#define __CircularQueue
#define T int
typedef struct {
T* Queue;
T Number;
T head;
T tail; //tail用来记录尾部数据下一个位置
} CircularQueue;
CircularQueue* CircularQueueCreate(T Number);
char CircularQueueIsEmpty(CircularQueue* obj);
char CircularQueueIsFull(CircularQueue* obj);
char CircularQueueEnQueue(CircularQueue* obj, T value);
char CircularQueueDeQueue(CircularQueue* obj);
T CircularQueueFront(CircularQueue* obj);
T CircularQueueRear(CircularQueue* obj);
void CircularQueueFree(CircularQueue* obj);
#undef T
#endif
浙公网安备 33010602011771号