当前位置:   article > 正文

C语言 设计循环队列_力扣typedef

力扣typedef

什么是循环队列

力扣题目要求及链接

数组实现循环链表

链表实现循环链表

什么是循环队列:

队列:是一种先进先出(first in first out,FIFO)的线性表,是一种常用的数据结构。

循环队列:就是将 队列 存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用。 在循环队列结构中,当存储空间的最后一个位置已被使用而再要进入队运算时,只需要存储空间的第一个位置空闲,便可将元素加入到第一个位置,即将存储空间的第一个位置作为队尾。

循环队列特点:如果设计一个需要可以存储k个元素的循环队列,一般来说需要开辟k+1个空间,多出的一个空间用于辅助判断循环队列是否"满"或“空”;

循环队列优点:相对于普通队列而言,再频繁删,加入操作下可节省空间。

循环队列概念图(循环队列为空时和不为满时):

 力扣题目要求及链接:链接

 数组实现循环队列:

  1. //数组实现
  2. typedef struct { // 数组实现时
  3. int* queue;
  4. int front;
  5. int tail;
  6. int size;
  7. } MyCircularQueue;
  8. MyCircularQueue* myCircularQueueCreate(int k);
  9. bool myCircularQueueEnQueue(MyCircularQueue* obj, int value);
  10. bool myCircularQueueDeQueue(MyCircularQueue* obj);
  11. int myCircularQueueFront(MyCircularQueue* obj);
  12. int myCircularQueueRear(MyCircularQueue* obj);
  13. bool myCircularQueueIsEmpty(MyCircularQueue* obj);
  14. bool myCircularQueueIsFull(MyCircularQueue* obj);
  15. void myCircularQueueFree(MyCircularQueue* obj);
  16. MyCircularQueue* myCircularQueueCreate(int k) {
  17. MyCircularQueue* cqueue = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
  18. cqueue->queue = (int*)malloc(sizeof(int) * (k+1)); //因为cqueue->queue是数组名称本来就是地址,所以可以这样写
  19. cqueue->front = cqueue->tail = 0; //tail是下标
  20. cqueue->size = k; //代表实际可以存储的元素个数
  21. return cqueue;
  22. }
  23. bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) { //tail指向的是最后一个有效内容后的空结点,如果不存在内容,则front和tail在一个位置
  24. if (myCircularQueueIsFull(obj)) //判满,为满时不可添加
  25. {
  26. return false;
  27. }
  28. obj->queue[obj->tail] = value;
  29. obj->tail = (obj->tail + 1) % (obj->size+1);
  30. return true;
  31. }
  32. bool myCircularQueueDeQueue(MyCircularQueue* obj) { //删除的基本逻辑是删除fornt当前所指向的内容后指向下一内容;
  33. if (myCircularQueueIsEmpty(obj)) //判空,为空不可再删除
  34. {
  35. return 0;
  36. }
  37. obj->front = (obj->front + 1) % (obj->size + 1);
  38. return true;
  39. }
  40. int myCircularQueueFront(MyCircularQueue* obj) {
  41. if (myCircularQueueIsEmpty(obj))
  42. {
  43. return -1; //题设队列为空时返回-1
  44. }
  45. return (obj->queue[obj->front]);
  46. }
  47. int myCircularQueueRear(MyCircularQueue* obj) {
  48. if (myCircularQueueIsEmpty(obj))
  49. {
  50. return -1;//题设队列为空时返回-1
  51. }
  52. /*return (obj->queue[obj->tail]);*/
  53. return obj->queue[(obj->tail + obj->size) % (obj->size + 1)]; //难点,主要是想不到
  54. }
  55. bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
  56. return (obj->front == obj->tail) ;
  57. }
  58. bool myCircularQueueIsFull(MyCircularQueue* obj) { //如何判满和空是这结构的难点之一
  59. return (obj->tail + 1) % (obj->size + 1) == obj->front; //难点,主要是想不到
  60. }
  61. void myCircularQueueFree(MyCircularQueue* obj) {
  62. //从里向外释放
  63. free(obj->queue); //obj->queue 是数组名称也free()释放
  64. obj->queue = NULL;
  65. obj->front = obj->size = obj->tail = 0;
  66. free(obj);
  67. /*obj = NULL;*/
  68. // 注意这里面即使写上 obj = NULL 也是无效的
  69. //obj是一个地址(指针),free是释放了指针指向的内容,
  70. //传参传的obj是实参的拷贝,在函数内部改变obj不对函数外的造成影响
  71. //所以要想使 obj = null 有效,要使用者在外部输入 obj = null ;
  72. }

 链表实现循环队列:

  1. //链表实现时
  2. typedef struct Node {
  3. int val;
  4. struct Node* next;
  5. }Node;
  6. typedef struct {
  7. Node* head;
  8. Node* tail;
  9. } MyCircularQueue;
  10. MyCircularQueue* myCircularQueueCreate(int k);
  11. bool myCircularQueueEnQueue(MyCircularQueue* obj, int value);
  12. bool myCircularQueueDeQueue(MyCircularQueue* obj);
  13. int myCircularQueueFront(MyCircularQueue* obj);
  14. int myCircularQueueRear(MyCircularQueue* obj);
  15. bool myCircularQueueIsEmpty(MyCircularQueue* obj);
  16. bool myCircularQueueIsFull(MyCircularQueue* obj);
  17. void myCircularQueueFree(MyCircularQueue* obj);
  18. MyCircularQueue* myCircularQueueCreate(int k) //个人认为链表实现的难点就在于创建
  19. {
  20. MyCircularQueue* queue = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
  21. queue->head = (Node*)malloc(sizeof(Node)); //多申请的一个结点
  22. Node* cur = queue->head;
  23. while ( k != 0)
  24. {
  25. cur->next = (Node*)malloc(sizeof(Node)); //妙啊
  26. cur = cur->next;
  27. k = k - 1;
  28. }
  29. cur->next = queue->head;
  30. queue->tail = queue->head;
  31. return queue;
  32. }
  33. bool myCircularQueueEnQueue(MyCircularQueue* obj, int value)
  34. {
  35. if (myCircularQueueIsFull(obj))
  36. {
  37. return false;
  38. }
  39. obj->tail->val = value;
  40. obj->tail = obj->tail->next;
  41. return true;
  42. }
  43. bool myCircularQueueDeQueue(MyCircularQueue* obj) {
  44. if (myCircularQueueIsEmpty(obj))
  45. {
  46. return false;
  47. }
  48. obj->head = obj->head->next;
  49. return true;
  50. }
  51. int myCircularQueueFront(MyCircularQueue* obj)
  52. {
  53. if (myCircularQueueIsEmpty(obj))
  54. {
  55. return -1;
  56. }
  57. return (obj->head->val);
  58. }
  59. int myCircularQueueRear(MyCircularQueue* obj) {
  60. if (myCircularQueueIsEmpty(obj))
  61. {
  62. return -1;
  63. }
  64. Node* cur = obj->head;
  65. while (cur->next != obj->tail)
  66. {
  67. cur = cur->next;
  68. }
  69. return cur->val;
  70. }
  71. bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
  72. return(obj->head == obj->tail);
  73. }
  74. bool myCircularQueueIsFull(MyCircularQueue* obj) {
  75. return (obj->tail->next == obj->head);
  76. }
  77. void myCircularQueueFree(MyCircularQueue* obj) {
  78. while (obj->head != obj->tail)
  79. {
  80. Node* cur = obj->head;
  81. obj->head = obj->head->next;
  82. free(cur);
  83. cur = NULL;
  84. }
  85. free(obj->head);
  86. obj->head = NULL;
  87. free(obj);
  88. }

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号