• 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. 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 相关阅读:
    【通道注意力机制】SENet
    SEO 笔记 10,网址覆盖率问题之网页会自动重定向
    【Linux】安装ZooKeeper
    bootloader学习笔记---第一篇以stm32为例
    速度精度双SOTA! TPAMI2022最新车道线检测算法(Ultra-Fast-Lane-Detection-V2)
    Node.js和浏览器在JavaScript运行环境方面存在一些区别和联系
    Package hyperref Warning: Ignoring empty anchor on input line 202.
    BUG:Enigma Virtual Box打包.net独立程序不正常
    【搭建OpenCV+Tesseract】
    [go]泛型扩展切片与map(filter与transfer)
  • 原文地址:https://blog.csdn.net/m0_64560763/article/details/126118483