OJ链接
思路:
我们这里有一个思路:
插入数据,bank往后走
怎么判断满,怎么判断空?
这样是不是比较难
下面是我们的结构体的定义
typedef struct { int* a; int front; int back; int k; } MyCircularQueue;
MyCircularQueue* myCircularQueueCreate(int k) { MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue)); obj->a = (int*)malloc(sizeof(int) * k + 1); obj->front = obj->back = 0; obj->k = k; return obj; }
bool myCircularQueueIsEmpty(MyCircularQueue* obj) { return obj->front == obj->back; }
bool myCircularQueueIsFull(MyCircularQueue* obj) { return (obj->back + 1) % (obj->k + 1) == obj->front; }
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) { if(myCircularQueueIsFull(obj)) return false; obj->a[obj->back] = value; obj->back++; obj->back %= (obj->k+1); return true; }
bool myCircularQueueDeQueue(MyCircularQueue* obj) { if(myCircularQueueIsEmpty(obj)) return false; obj->front++; obj->front %= (obj->k+1); return true; }
int myCircularQueueFront(MyCircularQueue* obj) { if(myCircularQueueIsEmpty(obj)) return -1; return obj->a[obj->front]; }
int myCircularQueueRear(MyCircularQueue* obj) { if(myCircularQueueIsEmpty(obj)) return -1; //可以这样写 //if(obj->back == 0) //return obj->a[obj->k]; //else //return obj->a[obj->back-1]; return obj->a[(obj->back-1+obj->k+1)%(obj->k+1)]; }
void myCircularQueueFree(MyCircularQueue* obj) { free(obj->a); free(obj); }
完整的代码实现
typedef struct { int* a; int front; int back; int k; } MyCircularQueue; MyCircularQueue* myCircularQueueCreate(int k) { MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue)); obj->a = (int*)malloc(sizeof(int)*(k+1)); obj->front = obj->back = 0; obj->k = k; return obj; } bool myCircularQueueIsEmpty(MyCircularQueue* obj) { return obj->front == obj->back; } bool myCircularQueueIsFull(MyCircularQueue* obj) { return (obj->back+1)%(obj->k+1) == obj->front; } bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) { if(myCircularQueueIsFull(obj)) return false; obj->a[obj->back] = value; obj->back++; obj->back %= (obj->k+1); return true; } bool myCircularQueueDeQueue(MyCircularQueue* obj) { if(myCircularQueueIsEmpty(obj)) return false; ++obj->front; obj->front %= (obj->k+1); return true; } int myCircularQueueFront(MyCircularQueue* obj) { if(myCircularQueueIsEmpty(obj)) return -1; return obj->a[obj->front]; } int myCircularQueueRear(MyCircularQueue* obj) { if(myCircularQueueIsEmpty(obj)) return -1; return obj->a[(obj->back-1+obj->k+1)%(obj->k+1)]; } void myCircularQueueFree(MyCircularQueue* obj) { free(obj->a); free(obj); }