当前位置:   article > 正文

数据结构——队列(C语言)

数据结构——队列(C语言)

需求:无

本篇文章将解决一下几个问题

  1. 队列是什么?
  2. 如何实现一个队列?
  3. 什么场景下会用队列?

 队列的概念:

  • 队列:一种只允许一端进行插入数据操作,在另一端进行删除操作的特殊线性表。队列具有先进先出(FIFO)入队列:进行插入操作的一端称为队尾,出队列的一端叫做队头。

e064eb8de17a4164ab9e1895bf2f3686.png

 队列的实现:

  •  队列也可以使用链表或者数组来实现。但是一般都是用链表来实现,如果用数组的话,出队列的时候,会移动数据,效率很低(O(N))。
  • 用链表实现,出队列时要记录好头节点的下一个节点。

37b47ee6de3642dbbe7f5ad44b660bc4.png

2006acdeb6154e3ebe67bbf581b678e6.png

  • 队列的判空:当元素个数为0,就是一个空队列,这时不允许出队列。

  • 队列元素的个数:当入队列的时候,size就+1,出队列时就-1,当我们需要元素个数的时候就不需要遍历,用O(1)的时间复杂度就可以完成队列的元素个数。

 队列的应用场景:

  •  其实在我们的生活中,到处都是队列的身影,像排队买票的时候,医院叫号的时候....
  • 还有就是想大麦app上抢演唱会的票等等,都有队列的身影。

队列的源码:

  1. void QueueInit(Queue* pq)
  2. {
  3. assert(pq);
  4. pq->tail = pq->head = NULL;
  5. pq->size = 0;
  6. }
  7. void QueueDestroy(Queue* pq)
  8. {
  9. assert(pq);
  10. QueueNode* cur = pq->head;
  11. while (cur)
  12. {
  13. QueueNode* next = cur->next;
  14. free(cur);
  15. cur = next;
  16. }
  17. }
  18. void QueuePush(Queue* pq, QueueDateType x)
  19. {
  20. assert(pq);
  21. QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
  22. if (newnode == NULL)
  23. {
  24. perror("malloc fail");
  25. exit(-1);
  26. }
  27. newnode->next = NULL;
  28. newnode->val = x;
  29. if (pq->head == NULL)
  30. {
  31. pq->tail = pq->head = newnode;
  32. }
  33. else
  34. {
  35. pq->tail->next = newnode;
  36. pq->tail = newnode;
  37. }
  38. pq->size++;
  39. }
  40. void QueuePop(Queue* pq)
  41. {
  42. assert(pq);
  43. assert(!QueueEmpty(pq));
  44. if (pq->head->next == NULL)
  45. {
  46. free(pq->head);
  47. pq->head = pq->tail = NULL;
  48. pq->size--;
  49. }
  50. else
  51. {
  52. QueueNode* next = pq->head->next;
  53. free(pq->head);
  54. pq->head = next;
  55. pq->size--;
  56. }
  57. }
  58. QueueDateType QueueFront(Queue* pq)
  59. {
  60. assert(pq);
  61. assert(!QueueEmpty(pq));
  62. return pq->head->val;
  63. }
  64. QueueDateType QueueBack(Queue* pq)
  65. {
  66. assert(pq);
  67. assert(!QueueEmpty(pq));
  68. return pq->tail->val;
  69. }
  70. int QueueSize(Queue* pq)
  71. {
  72. assert(pq);
  73. return pq->size;
  74. }
  75. bool QueueEmpty(Queue* pq)
  76. {
  77. assert(pq);
  78. return pq->head == NULL;
  79. }
  80. void QueuePrint(Queue* pq)
  81. {
  82. assert(pq);
  83. while (pq->head)
  84. {
  85. printf("%d ", pq->head->val);
  86. pq->head = pq->head->next;
  87. }
  88. printf("\n");
  89. }

  1. typedef int QueueDateType;
  2. typedef struct QueueNode
  3. {
  4. struct QueueNode* next;
  5. QueueDateType val;
  6. }QueueNode;
  7. typedef struct Queue
  8. {
  9. QueueNode* head;
  10. QueueNode* tail;
  11. int size;
  12. }Queue;
  13. void QueueInit(Queue* pq);
  14. void QueueDestroy(Queue* pq);
  15. void QueuePush(Queue* pq,QueueDateType x);
  16. void QueuePop(Queue* pq);
  17. QueueDateType QueueFront(Queue* pq);
  18. QueueDateType QueueBack(Queue* pq);
  19. int QueueSize(Queue* pq);
  20. bool QueueEmpty(Queue* pq);
  21. void QueuePrint(Queue* pq);

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

闽ICP备14008679号