当前位置:   article > 正文

【数据结构入门 】队列

【数据结构入门 】队列

目录

前言

一、队列的概念及结构

1.概念

2.结构

二、队列的实现

1.队列的声明

2.初始化队列

 3.队列的销毁

 4.入队

5.出队

 6.获取队列有效元素个数

7. 判断队列是否为空

8.获取队首元素

 9.获取队尾元素

结论


前言

        队列是一种数据结构,它遵循先进先出(FIFO)的原则。这意味着最先进入队列的元素将最先被处理或移除,而最后进入队列的元素将最后被处理或移除。

        队列的基本操作包括入队(向队列尾部添加元素)出队(从队列头部移除元素)

一、队列的概念及结构

1.概念

队列是一种具有先进先出(FIFO)特性的数据结构。它类似于在超市排队购物时的情景,新来的人只能排在队尾,而离开队伍的人是从队首开始。在队列中,元素按照插入的顺序排列,并且只能在队尾添加新元素,而只能在队首删除元素。这使得队列成为处理按照先后顺序排列的数据的理想选择。

队列有两个主要操作:入队(enqueue)和出队(dequeue)。入队操作将元素添加到队尾,出队操作将队首的元素删除并返回。除此之外,队列还可以支持其他操作,如获取队首元素、判断队列是否为空等。

队列在计算机科学中广泛应用,例如任务调度、消息传递、缓冲区管理等领域。在编程中,队列通常使用数组或链表来实现。

2.结构

二、队列的实现

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

1.队列的声明

使用链表结构,要返回多个参数,所以使用结构体封装。

 

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

2.初始化队列

 

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

 3.队列的销毁

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

 4.入队

  1. void QueuePush(Queue* pq, QDataType x)
  2. {
  3. QNode* newnode = (QNode*)malloc(sizeof(QNode));
  4. if (newnode == NULL)
  5. {
  6. perror("malloc fail");
  7. return;
  8. }
  9. newnode->data = x;
  10. newnode->next = NULL;
  11. //没有结点插入时
  12. if (pq->head == NULL)
  13. {
  14. assert(pq->tail == NULL);
  15. pq->head = pq->tail = newnode;
  16. }
  17. else
  18. {
  19. pq->tail->next = newnode;
  20. pq->tail = newnode;
  21. }
  22. pq->size++;
  23. }

5.出队

  1. void QueuePop(Queue* pq)
  2. {
  3. assert(pq && pq->head);
  4. if (pq->head->next == NULL)
  5. {
  6. free(pq->head);
  7. pq->head = pq->tail = NULL;
  8. }
  9. else
  10. {
  11. QNode* next = pq->head->next;
  12. free(pq->head);
  13. pq->head = next;
  14. }
  15. pq->size--;
  16. }

 6.获取队列有效元素个数

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

7. 判断队列是否为空

  1. bool QueueEmpty(Queue* pq)
  2. {
  3. assert(pq);
  4. return pq->size == 0;
  5. }

8.获取队首元素

  1. QDataType QueueFront(Queue* pq)
  2. {
  3. assert(pq);
  4. assert(!QueueEmpty(pq));
  5. return pq->head->data;
  6. }

 9.获取队尾元素

  1. QDataType QueueBack(Queue* pq)
  2. {
  3. assert(pq);
  4. assert(!QueueEmpty(pq));
  5. return pq->tail->data;
  6. }

结论

队列和栈的区别:

  1. 数据操作方式:队列是先进先出,栈是后进先出。
  2. 插入和删除操作:队列的插入操作是在队尾进行,删除操作是在队头进行;栈的插入和删除操作都是在栈顶进行。
  3. 访问限制:队列只能访问队头和队尾元素,不能访问队列中间的元素;栈只能访问栈顶元素。
  4. 应用场景:队列常用于需要按顺序处理数据的场景,如任务调度、消息队列等;栈常用于需要后进先出的场景,如表达式求值、函数调用等。

在实际应用中,队列和栈经常结合使用,例如使用栈来实现队列,或者使用队列来实现栈。它们是解决问题的重要工具,根据具体的场景和需求选择合适的数据结构是很重要的。

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

闽ICP备14008679号