当前位置:   article > 正文

数据结构:队列

数据结构:队列

一 队列的基本概念:

1.队列的定义:

队列(Queue)简称队,也是和栈一样是一种受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除。向队列中插入元素称为入队或进队删除元素称为出队或离队。这和我们日常生活中的排队是一致的,最早排队的也是对早离队的,其操作的特性就是先进先出(First In First Out FIFO)。
队头 (Front) 允许删除的一端,又称队首。
队尾(Rear) 允许插入的一端。
空队列 不含元素的空链表。

二 队列的链式存储结构:

1.队列的存储结构:

  1. typedef int QDataType;
  2. typedef struct QueueNode
  3. {
  4. int val;
  5. struct QueueNode* next;
  6. }QNode;
  7. typedef struct Queue
  8. {
  9. QNode* phead;
  10. QNode* ptail;
  11. int size;
  12. }Queue;

2.队列的所有接口:

  1. //队列的初始化、销毁
  2. void QueueInit(Queue* pq);
  3. void QueueDestroy(Queue* pq);
  4. // 入队列、 出队列
  5. void QueuePush(Queue* pq, QDataType x);
  6. void QueuePop(Queue* pq);
  7. //获取队头、队尾元素
  8. QDataType QueueFront(Queue* pq);
  9. QDataType QueueBack(Queue* pq);
  10. //判断队列是否为空
  11. bool QueueEmpty(Queue* pq);
  12. //获取队列元素个数
  13. int QueueSize(Queue* pq);

3.队列的初始化:

  1. void QueueInit(Queue* pq)
  2. {
  3. pq->phead = NULL;
  4. pq->ptail = NULL;
  5. pq->size = 0;
  6. }

输出:

4.队列的销毁:

  1. void QueueDestroy(Queue* pq)
  2. {
  3. assert(pq);
  4. QNode* cur = pq->phead;
  5. while (cur)
  6. {
  7. QNode* next = cur->next;
  8. free(cur);
  9. cur = next;
  10. }
  11. pq->phead = pq->ptail = NULL;
  12. pq->size = 0;
  13. }

销毁:

5.入队列:

  1. void QueuePush(Queue* pq, QDataType x)
  2. {
  3. assert(pq);
  4. QNode* Newnode = (QNode*)malloc(sizeof(QNode));
  5. if (Newnode == NULL)
  6. {
  7. perror("malloc error");
  8. exit(-1);
  9. }
  10. Newnode->next = NULL;
  11. Newnode->val = x;
  12. if (pq->ptail)
  13. {
  14. pq->ptail->next = Newnode;
  15. pq->ptail = Newnode;
  16. }
  17. else
  18. {
  19. pq->phead = pq->ptail = Newnode;//当最开始的时候我们让phead,ptail指针都指向Newnode
  20. }
  21. pq->size++;
  22. }

输出:

6.出队列:

  1. void QueuePop(Queue* pq)
  2. {
  3. assert(pq);
  4. assert(pq->phead != NULL);
  5. // 一个节点
  6. if (pq->phead->next == NULL)
  7. {
  8. free(pq->phead);
  9. pq->phead = pq->ptail = NULL;
  10. }
  11. // 多个节点
  12. else
  13. {
  14. QNode* next = pq->phead->next;
  15. free(pq->phead);
  16. pq->phead = next;
  17. }
  18. pq->size--;
  19. }

输出:

7.获取队顶元素:

  1. QDataType QueueFront(Queue* pq)
  2. {
  3. return pq->phead->val;
  4. }

输出:

8.获取队尾数据:

  1. QDataType QueueBack(Queue* pq)
  2. {
  3. return pq->ptail->val;
  4. }

输出:

9.获取有效数据个数:

  1. int QueueSize(Queue* pq)
  2. {
  3. return pq->size;
  4. }

输出:

10.判断队列是否为空:

  1. bool QueueEmpty(Queue* pq)
  2. {
  3. if (pq->ptail == NULL)
  4. {
  5. return false;
  6. }
  7. else
  8. {
  9. return true;
  10. }
  11. }

输出:

11.打印队列:

队列与栈的总结:

队列是一种遵循先进先出(FIFO)受限的线性数据结构。元素从队列的尾部添加,从队列的头部移除。队列通常用于模拟现实世界中按到达顺序处理项目的场景。

是一种遵循后进先出(LIFO)受限的线性数据结构。元素从栈的顶部添加,从栈的顶部移除。栈通常用于实现涉及回溯或解决递归问题的算法。

队列和栈是基础数据结构,具有不同的特性和应用。队列适用于按顺序管理项,而栈适用于实现涉及回溯或解决递归问题的算法。

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

闽ICP备14008679号