当前位置:   article > 正文

【C语言/数据结构】队列:从概念到队列的实现

【C语言/数据结构】队列:从概念到队列的实现


  • 在日常生活中,我们去车站窗口买票,或去医院问诊都会进行排队,而排队表示着一种先到先买票,或先问诊的准则;前一个人走了,后面一个人补上前一个人的位置。
  • 试想,大家正在排队购票的时候,走来了一个醉汉想要插队,正在排队的你会愿意吗?我想你一定会说,我不愿意。
  • 所以排队也有着一种,后来的人,要在队尾排队等待,队头的人先得到服务,且正常情况下,也是队头的人先一步离开;
  • 数据结构中存在一种特殊的线性表,和咱们日常生活中的排队有着息息相关的的关系——队列(Queue)

一、队列的基础知识

1.队列的定义

        队列是一种特殊的线性表,只允许在一端插入数据,在另一端删除数据;插入数据的一端叫做队尾,插入数据的一端叫做队头;其有着先进先出的准则,FIFO(First In First Out)。

2.队列的功能接口

 初始化

 销毁

 插入数据

 删除数据

 获取队头元素

 获取队尾元素

 返回队列的元素个数

 判断队列是否为空

二、队列的设计思路

1.顺序结构实现队列

2.链式结构实现队列

3.两种结构之间的比较

  • 链式结构实现队列:队头与队尾的设计,使得只存在第一个结点数据的删除,巧妙的避开了删除一个结点,需要找到一个结点的问题;插入和删除元素的时间复杂度为O(1);
  • 顺序结构实现队列:数组删除队头的元素时,后面的所有元素,需要向前挪动,其时间复杂度为O(N);
  • 总结:实现队列的最优结构是链式结构,下面将对链式结构实现队列进行深入讲解

三、队列的代码实现

1.初始化

  1. // 初始化
  2. void QueueInit(Queue* qu)
  3. {
  4. assert(qu);
  5. qu->phead = qu->ptail = NULL;
  6. qu->size = 0;
  7. }

2.毁销

  1. // 销毁
  2. void QueueDestory(Queue* qu)
  3. {
  4. while (!QueueEmpty(qu))
  5. {
  6. QueuePop(qu);
  7. }
  8. }

3.插入数据

  1. // 队尾插入
  2. void QueuePush(Queue* qu, QDateType x)
  3. {
  4. assert(qu);
  5. QNode* newnode = (QNode*)malloc(sizeof(QNode));
  6. if (!newnode)
  7. {
  8. perror("malloc mistake");
  9. return;
  10. }
  11. newnode->Date = x;
  12. newnode->next = NULL;
  13. if (qu->ptail == NULL)
  14. {
  15. qu->phead = qu->ptail = newnode;
  16. }
  17. else
  18. {
  19. qu->ptail->next = newnode;
  20. qu->ptail = newnode;
  21. }
  22. qu->size++;
  23. }

4.删除数据

  1. // 队头删除
  2. void QueuePop(Queue* qu)
  3. {
  4. assert(qu);
  5. //没有元素的处理
  6. if (qu->size == 0)
  7. return;
  8. //只有一个元素的处理
  9. if (qu->ptail == qu->phead)
  10. {
  11. free(qu->phead);
  12. qu->phead = qu->ptail = NULL;
  13. }
  14. //多个元素的处理方法
  15. else
  16. {
  17. QNode* next = qu->phead->next;
  18. free(qu->phead);
  19. qu->phead = next;
  20. }
  21. //不要忘了size -1
  22. qu->size--;
  23. }

 5.获取队头元素

  1. // 获取队头数据
  2. QDateType QueueFront(Queue* qu)
  3. {
  4. assert(qu);
  5. return qu->phead->Date;
  6. }

 6.获取队尾元素

  1. // 获取队尾数据
  2. QDateType QueueBack(Queue* qu)
  3. {
  4. assert(qu);
  5. return qu->ptail->Date;
  6. }

7.返回队列的元素个数

  1. // 获取队列长度
  2. size_t QueueSize(Queue* qu)
  3. {
  4. assert(qu);
  5. return qu->size;
  6. }

 8.判断队列是否为空

  1. // 判空
  2. bool QueueEmpty(Queue* qu)
  3. {
  4. assert(qu);
  5. return qu->size == 0 ? true : false;
  6. }

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

闽ICP备14008679号