关键词搜索

源码搜索 ×
×

【数据结构】队列

发布2022-04-06浏览739次

详情内容

注:队列的实现需要一定的链表基础

队列的概念及结构

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出。

进行插入操作的一端称为队尾,

进行删除操作的一端称为队头。

队列的实现:

队列可以采用数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列再数组头上出数据,效率会较低。

综合效益考虑:链表更优。

准备阶段:

构建结构体:

  1. //以链表形式构造队列
  2. typedef int QDataType;
  3. //链表的节点
  4. typedef struct QueueNode
  5. {
  6. QDataType data;//数据
  7. struct QueueNode* next;//标记下一个节点
  8. }QNode;
  9. //队列
  10. //头指针:进行数据的删除操作
  11. //尾指针:进行数据的插入操作
  12. typedef struct Queue
  13. {
  14. QNode* head;//头指针
  15. QNode* tail;//尾指针
  16. }Queue;

 

注意:两个结构体不能合为一个。

1.初始化

对队列进行初始化,而不是对节点进行初始化。

  1. void QueueInit(Queue* pq)
  2. {
  3. //断言
  4. assert(pq);
  5. pq->head = pq->tail = NULL;
  6. }

2.销毁队列

基本思路:1)断言

2)遍历队列,释放节点

3)最后将head tail 置空

代码:

  1. void QueueDestory(Queue* pq)
  2. {
  3. //断言
  4. assert(pq);
  5. //遍历
  6. QNode* cur = pq->head;
  7. while (cur)
  8. {
  9. QNode* next = cur->next;
  10. free(cur);
  11. cur = next;
  12. }
  13. //置空
  14. pq->head = pq->tail = NULL;
  15. }
  1. void QueuePush(Queue* pq, QDataType x)
  2. {
  3. //断言
  4. assert(pq);
  5. //申请节点
  6. QNode* newnode = (QNode*)malloc(sizeof(QNode));
  7. if (newnode == NULL)
  8. {
  9. printf("malloc fail\n");
  10. exit(-1);
  11. }
  12. //newnode的初始化
  13. else
  14. {
  15. newnode->data = x;
  16. newnode->next = NULL;
  17. }
  18. //队列为空
  19. if (pq->tail == NULL)
  20. {
  21. //当tail为空时,head必为空,若不是则为程序自身bug
  22. assert(pq->head == NULL);
  23. //直接把newnode作为新的头节点
  24. pq->head = pq->tail = newnode;
  25. }
  26. else
  27. {
  28. //链接节点
  29. pq->tail->next = newnode;
  30. pq->tail = newnode;
  31. }
  32. }

4.删除队列元素

思路:本质上就是单链表的头删。

代码:

  1. void QueuePop(Queue* pq)
  2. {
  3. assert(pq);
  4. //分情况
  5. //1.队列为空
  6. assert(pq->head && pq->tail);
  7. //2.只有一个节点
  8. if (pq->head->next == NULL)
  9. {
  10. free(pq->head);
  11. pq->head = pq->tail = NULL;
  12. }
  13. //3.多个节点
  14. else
  15. {
  16. //记录下一个节点
  17. QNode* next = pq->head->next;
  18. //释放节点
  19. free(pq->head);
  20. //更新头节点
  21. pq->head = next;
  22. }
  23. }

5.判断队列是否为空

空返回true 否返回false

思路:1)断言

2)直接返回头节点是否为空的返回值即可。

代码:

  1. bool QueueEmpty(Queue* pq)
  2. {
  3. //断言
  4. assert(pq);
  5. return pq->head == NULL;
  6. }

6.记录队列元素个数

思路:1)断言

2)创建临时变量-计数器,遍历队列,返回计数器的值。

代码:

  1. size_t QueueSize(Queue* pq)
  2. {
  3. //断言
  4. assert(pq);
  5. size_t numsize = 0;
  6. QNode* cur = pq->head;
  7. while (cur)
  8. {
  9. numsize++;
  10. cur = cur->next;
  11. }
  12. return numsize;
  13. }

7.返回队列头的值

思路:1)断言

2)判断队列是否为空。

3)返回值

代码:

  1. QDataType QueueFront(Queue* pq)
  2. {
  3. //断言
  4. assert(pq);
  5. //判断队列是否为空
  6. assert(pq->head);
  7. return pq->head->data;
  8. }

8.返回队尾的值

思路:1)断言

2)判断队列是否为空

3)返回队尾的值

代码:

  1. QDataType QueueBack(Queue* pq)
  2. {
  3. //断言
  4. assert(pq);
  5. //判断队列是否为空
  6. assert(pq->tail);
  7. return pq->tail->data;
  8. }

队列完。。。

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载