当前位置:   article > 正文

LeetCode·每日一题·_力扣每日一题在哪里

力扣每日一题在哪里

链接:https://leetcode.cn/problems/design-circular-queue/solution/by-xun-ge-v-lu8a/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 

题目

 

示例

 

思路

模拟构造法
循型队列应该是非常基础并且重要的数据结构,循环队列的一个好处是我们可以利用这个队列之前用过的空间。
对于队列有两种基本实现结构

  • 用数组实现的队列->也称顺序队列
  • 用链表实现的队列->也陈链式队列

对于循环队列自然也可以用数组或者链表实现,循环队列其实本质上和普通队列没有什么区别,只是在普通队列的基础之上加了取余操作,使之在逻辑在形成了循环,然而本质上还是一个普通队列。

用数组和链表都一样,构造普通队列,在插入和删除操作时+取余操作,使之在逻辑上循环
对于数组实现


typedef struct {
    int * queue;//普通队列数组实现
    int front;//对头
    int rear;//对尾
    int size;//队列大小
    int logo;//当前元素个数
} MyCircularQueue;


可以定义当前元素个数,也可以在定义队列大小时+1,用front与rear判断队列是否满

  • front == rear 队列为空
  • (rear+1) % size = front 队列为满

代码

数组实现

  1. typedef struct {
  2. int * queue;//普通队列数组实现
  3. int front;//对头
  4. int rear;//对尾
  5. int size;//队列大小
  6. int logo;//当前元素个数
  7. } MyCircularQueue;
  8. //MyCircularQueue(k): 构造器,设置队列长度为 k 。
  9. MyCircularQueue* myCircularQueueCreate(int k) {
  10. MyCircularQueue * obj = malloc(sizeof(MyCircularQueue));
  11. obj->queue = malloc(sizeof(int) * k);
  12. obj->size = k;
  13. obj->front = 0;
  14. obj->rear = 0;
  15. obj->logo = 0;
  16. return obj;
  17. }
  18. //enQueue(value):向循环队列插入一个元素。如果成功插入则返回真。
  19. bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
  20. if(obj->logo == obj->size)
  21. {
  22. return false;
  23. }
  24. obj->queue[(obj->rear)%(obj->size)] = value;
  25. obj->logo++;
  26. obj->rear++;
  27. return true;
  28. }
  29. //deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
  30. bool myCircularQueueDeQueue(MyCircularQueue* obj) {
  31. if(obj->logo == 0)
  32. {
  33. return false;
  34. }
  35. obj->logo--;
  36. obj->front++;
  37. obj->front %= obj->size;
  38. return true;
  39. }
  40. //Front: 从队首获取元素。如果队列为空,返回 -1
  41. int myCircularQueueFront(MyCircularQueue* obj) {
  42. if(obj->logo == 0)
  43. {
  44. return -1;
  45. }
  46. return obj->queue[obj->front];
  47. }
  48. //Rear: 获取队尾元素。如果队列为空,返回 -1
  49. int myCircularQueueRear(MyCircularQueue* obj) {
  50. if(obj->logo == 0)
  51. {
  52. return -1;
  53. }
  54. return obj->queue[(obj->rear-1) % obj->size];
  55. }
  56. //isEmpty(): 检查循环队列是否为空。
  57. bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
  58. if(obj->logo == 0)
  59. {
  60. return true;
  61. }
  62. return false;
  63. }
  64. //isFull(): 检查循环队列是否已满。
  65. bool myCircularQueueIsFull(MyCircularQueue* obj) {
  66. if(obj->logo == obj->size)
  67. {
  68. return true;
  69. }
  70. return false;
  71. }
  72. void myCircularQueueFree(MyCircularQueue* obj) {
  73. free(obj->queue);
  74. free(obj);
  75. }
  76. /**
  77. * Your MyCircularQueue struct will be instantiated and called as such:
  78. * MyCircularQueue* obj = myCircularQueueCreate(k);
  79. * bool param_1 = myCircularQueueEnQueue(obj, value);
  80. * bool param_2 = myCircularQueueDeQueue(obj);
  81. * int param_3 = myCircularQueueFront(obj);
  82. * int param_4 = myCircularQueueRear(obj);
  83. * bool param_5 = myCircularQueueIsEmpty(obj);
  84. * bool param_6 = myCircularQueueIsFull(obj);
  85. * myCircularQueueFree(obj);
  86. */
  87. 作者:xun-ge-v
  88. 链接:https://leetcode.cn/problems/design-circular-queue/solution/by-xun-ge-v-lu8a/
  89. 来源:力扣(LeetCode)
  90. 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

链表实现

  1. typedef struct {
  2. struct ListNode *head;
  3. struct ListNode *tail;
  4. int capacity;
  5. int size;
  6. } MyCircularQueue;
  7. MyCircularQueue* myCircularQueueCreate(int k) {
  8. MyCircularQueue *obj = (MyCircularQueue *)malloc(sizeof(MyCircularQueue));
  9. obj->capacity = k;
  10. obj->size = 0;
  11. obj->head = obj->tail = NULL;
  12. return obj;
  13. }
  14. bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
  15. if (obj->size >= obj->capacity) {
  16. return false;
  17. }
  18. struct ListNode *node = (struct ListNode *)malloc(sizeof(struct ListNode));
  19. node->val = value;
  20. node->next = NULL;
  21. if (!obj->head) {
  22. obj->head = obj->tail = node;
  23. } else {
  24. obj->tail->next = node;
  25. obj->tail = node;
  26. }
  27. obj->size++;
  28. return true;
  29. }
  30. bool myCircularQueueDeQueue(MyCircularQueue* obj) {
  31. if (obj->size == 0) {
  32. return false;
  33. }
  34. struct ListNode *node = obj->head;
  35. obj->head = obj->head->next;
  36. obj->size--;
  37. free(node);
  38. return true;
  39. }
  40. int myCircularQueueFront(MyCircularQueue* obj) {
  41. if (obj->size == 0) {
  42. return -1;
  43. }
  44. return obj->head->val;
  45. }
  46. int myCircularQueueRear(MyCircularQueue* obj) {
  47. if (obj->size == 0) {
  48. return -1;
  49. }
  50. return obj->tail->val;
  51. }
  52. bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
  53. return obj->size == 0;
  54. }
  55. bool myCircularQueueIsFull(MyCircularQueue* obj) {
  56. return obj->size == obj->capacity;
  57. }
  58. void myCircularQueueFree(MyCircularQueue* obj) {
  59. for (struct ListNode *curr = obj->head; curr;) {
  60. struct ListNode *node = curr;
  61. curr = curr->next;
  62. free(node);
  63. }
  64. free(obj);
  65. }
  66. 作者:xun-ge-v
  67. 链接:https://leetcode.cn/problems/design-circular-queue/solution/by-xun-ge-v-lu8a/
  68. 来源:力扣(LeetCode)
  69. 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/315483
推荐阅读
相关标签
  

闽ICP备14008679号