1. // 判空时用 count 记录
    2. typedef struct {
    3. int *pdata;
    4. int head;
    5. int tail;
    6. int size;
    7. int count;
    8. } MyCircularQueue;
    9. MyCircularQueue* myCircularQueueCreate(int k) {
    10. if (k <= 0) {
    11. return NULL;
    12. }
    13. MyCircularQueue* queue = (MyCircularQueue *)malloc(sizeof(MyCircularQueue));
    14. if (!queue) {
    15. return NULL;
    16. }
    17. queue->pdata = (int *)malloc(sizeof(int) * k);
    18. queue->head = 0;
    19. queue->tail = 0;
    20. queue->size = k;
    21. queue->count = 0;
    22. for (int i = 0; i < k; i++) {
    23. queue->pdata[i] = -1;
    24. }
    25. return queue;
    26. }
    27. bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
    28. return obj->count == 0;
    29. }
    30. bool myCircularQueueIsFull(MyCircularQueue* obj) {
    31. return obj->count == obj->size;
    32. }
    33. bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    34. if (myCircularQueueIsFull(obj))
    35. return false;
    36. obj->pdata[obj->tail] = value;
    37. obj->tail = (obj->tail + 1) % obj->size;
    38. obj->count++;
    39. return true;
    40. }
    41. bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    42. if (myCircularQueueIsEmpty(obj)) {
    43. return false;
    44. }
    45. obj->pdata[obj->head] = -1;
    46. obj->head = (obj->head + 1) % obj->size;
    47. obj->count--;
    48. return true;
    49. }
    50. int myCircularQueueFront(MyCircularQueue* obj) {
    51. return obj->pdata[(obj->head) % obj->size];
    52. }
    53. int myCircularQueueRear(MyCircularQueue* obj) { // 当队列为空时,取尾结点,tail-1为负,所以加上一个size 长度
    54. return obj->pdata[(obj->tail - 1 + obj->size) % obj->size]; // -1 是因为tail 指向的是该填入的位置
    55. }
    56. void myCircularQueueFree(MyCircularQueue* obj) {
    57. free(obj->pdata);
    58. free(obj);
    59. }
    60. ## 不用 count , 就是多申请了一块内存,判空的方式不同,其他的完全一样
    61. MyCircularQueue* myCircularQueueCreate(int k) {
    62. if (k <= 0) {
    63. return NULL;
    64. }
    65. MyCircularQueue* queue = (MyCircularQueue *)malloc(sizeof(MyCircularQueue));
    66. if (!queue) {
    67. return NULL;
    68. }
    69. queue->pdata = (int *)malloc(sizeof(int) * (k + 1));
    70. queue->head = 0;
    71. queue->tail = 0;
    72. queue->size = k + 1;
    73. //queue->count = 0;
    74. for (int i = 0; i < k + 1; i++) {
    75. queue->pdata[i] = -1;
    76. }
    77. return queue;
    78. }
    79. bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
    80. return obj->head == obj->tail;
    81. }
    82. bool myCircularQueueIsFull(MyCircularQueue* obj) {
    83. return obj->head == (obj->tail + 1) % obj->size;
    84. }