• leetcode622-设计循环队列


     本题重点:

    1. 选择合适的数据结构

    2. 针对选择的数据结构判断“空”和“满”

    这两点是不分先后次序的,在思考时应该被综合起来。事实上,无论我们选择链表还是数组,最终都能实现题中描述的“循环队列”的功能,只不过选择不同结构时,我们面临和需要解决的问题不同。

    一、思路

    1. 数组实现队列。定义变量 front 标识队头,变量 rear 标识队尾。

    数组设计循环队列的好处:

    1. 找队尾元素方便;使用链表实现时,需要找尾。

    2. 循环实现方便,通过控制下标即可完成循环。

    2. 初始时,front = rear = 0,每次插入一个元素,rear向后走一位。

    3. 判断“空” 和 “满”。如果 front 和 rear 下标相同,队列为空,还是满?

    4. 理解(rear + 1)% (k + 1)== front

    若队列已满,则rear 的下一个位置为 front。

    此外,每一次插入数据 或者 删除数据 后,都要进行取模操作

    防止 front 和 rear 走出实际数组的范围,造成数组越界。

    二、功能模块实现 

    1. MyCircularQueue(k): 设置队列长度为 k

    1. typedef struct {
    2. int* a; // 指向的空间用来存储元素
    3. int front;
    4. int rear;
    5. int k;
    6. } MyCircularQueue;
    7. MyCircularQueue* myCircularQueueCreate(int k) {
    8. MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
    9. obj->front = obj->rear = 0;
    10. obj->k = k;
    11. obj->a = (int*)malloc(sizeof(int) * (k + 1));
    12. // 多创建1个空位,
    13. // 该位置不用来存储元素,仅用于判断队列“空”和“满”
    14. return obj;
    15. }

    2. isEmpty(): 检查循环队列是否为空

    1. bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
    2. if(obj->rear == obj->front)
    3. return true;
    4. else
    5. return false;
    6. }

    3. isFull(): 检查循环队列是否已满

    1. bool myCircularQueueIsFull(MyCircularQueue* obj) {
    2. if((obj->rear + 1) % (obj->k + 1) == obj->front)
    3. return true;
    4. else
    5. return false;
    6. }

    4. enQueue(value): 向循环队列插入一个元素。

    如果成功插入则返回真。

    1. bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    2. if(myCircularQueueIsFull(obj))
    3. return false;
    4. else
    5. {
    6. obj->a[obj->rear] = value;
    7. obj->rear++;
    8. obj->rear %= obj->k + 1;
    9. return true;
    10. }
    11. }

    5. deQueue(): 从循环队列中删除一个元素。

    如果成功删除则返回真。

    1. bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    2. if(myCircularQueueIsEmpty(obj))
    3. return false;
    4. else
    5. {
    6. obj->front++;
    7. obj->front %= obj->k + 1;
    8. return true;
    9. }
    10. }

     6. Front: 从队首获取元素。

    如果队列为空,返回 -1 。

    1. int myCircularQueueFront(MyCircularQueue* obj) {
    2. if(myCircularQueueIsEmpty(obj))
    3. return -1;
    4. else
    5. return obj->a[obj->front];
    6. }

    7. Rear: 获取队尾元素。

    如果队列为空,返回 -1 。 

    1. int myCircularQueueRear(MyCircularQueue* obj) {
    2. if(myCircularQueueIsEmpty(obj))
    3. return -1;
    4. else
    5. return obj->a[(obj->rear + (obj->k + 1) - 1) % (obj->k + 1)];
    6. }

    8. QueueFree: 销毁循环队列

    1. void myCircularQueueFree(MyCircularQueue* obj) {
    2. free(obj->a);
    3. free(obj);
    4. }

     

    三、所有代码

    1. typedef struct {
    2. int* a;
    3. int front;
    4. int rear;
    5. int k;
    6. } MyCircularQueue;
    7. MyCircularQueue* myCircularQueueCreate(int k) {
    8. MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
    9. obj->front = obj->rear = 0;
    10. obj->k = k;
    11. obj->a = (int*)malloc(sizeof(int) * (k + 1));
    12. return obj;
    13. }
    14. bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
    15. if(obj->rear == obj->front)
    16. return true;
    17. else
    18. return false;
    19. }
    20. bool myCircularQueueIsFull(MyCircularQueue* obj) {
    21. if((obj->rear + 1) % (obj->k + 1) == obj->front)
    22. return true;
    23. else
    24. return false;
    25. }
    26. bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    27. if(myCircularQueueIsFull(obj))
    28. return false;
    29. else
    30. {
    31. obj->a[obj->rear] = value;
    32. obj->rear++;
    33. obj->rear %= obj->k + 1;
    34. return true;
    35. }
    36. }
    37. bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    38. if(myCircularQueueIsEmpty(obj))
    39. return false;
    40. else
    41. {
    42. obj->front++;
    43. obj->front %= obj->k + 1;
    44. return true;
    45. }
    46. }
    47. int myCircularQueueFront(MyCircularQueue* obj) {
    48. if(myCircularQueueIsEmpty(obj))
    49. return -1;
    50. else
    51. return obj->a[obj->front];
    52. }
    53. int myCircularQueueRear(MyCircularQueue* obj) {
    54. if(myCircularQueueIsEmpty(obj))
    55. return -1;
    56. else
    57. return obj->a[(obj->rear + (obj->k + 1) - 1) % (obj->k + 1)];
    58. }
    59. void myCircularQueueFree(MyCircularQueue* obj) {
    60. free(obj->a);
    61. free(obj);
    62. }

  • 相关阅读:
    python re.findall和re.search同样的正则表达式,为什么规则不一样??
    Java --- JVM虚拟机栈
    比 N 小的最大质数
    从产品角度分析羊了个羊为何能爆火
    MFC Windows 程序设计[126]之控制台适配器
    刷题记录第二十七天-环形链表II
    网络安全(黑客)自学
    高维数据降维(机器学习)
    微信小程序消息订阅Java
    LeetCode 86 双周赛
  • 原文地址:https://blog.csdn.net/taduanlangan/article/details/132273510