数据结构-队列

简介: 数据结构-队列

1.队列的概念及结构


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

cdce19bde7244dcb99e93745b6458832.png


2.队列的实现


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

a3f1189447f0415898addf0dd3db08f4.png f9636776c95a43d48b4c93587a2d14d0.png

6d262ab6e127401eaee75b251d1b3d42.png

aeab35642cf64fef8304aad76ab44cf6.png

2.1定义队列

多个值我们使用两个结构体来封装,方便找头和尾。

typedef int QDataType;
typedef struct QueueNode
{
  struct QueueNode* next;
  QDataType data;
}QNode;
typedef struct Queue
{
  QNode* head;
  QNode* tail;
  int size;
}Que;

2.2初始化队列

void QueueInit(Que* pq)
{
  assert(pq);
  pq->size = 0;
  pq->head = pq->tail = NULL;
}

2.3销毁队列

销毁队列需要遍历,并且需要提前保存下一个节点的地址。

void QueueDestroy(Que* pq)
{
  assert(pq);
  QNode* cur = pq->head;
  while (cur)
  {
  QNode* next = cur->next;
  free(cur);
  cur = next;
  }
  pq->head = pq->tail = NULL;
  pq->size = 0;
}

2.3数据入队列

首先为新节点malloc一块空间,将data赋值,然后将此节点的next置空。开始入对列,这时需要注意,如果队列为空,则此节点就同时是头和尾,如果不为空,则链接在tail的后面,在将新节点置为tail,最后size++。

void QueuePush(Que* pq, QDataType x)
{
  assert(pq);
  QNode* tmp = (QNode*)malloc(sizeof(QNode));
  if (tmp == NULL)
  {
  perror("malloc fail");
  exit(-1);
  }
  tmp->data = x;
  tmp->next = NULL;
  if (pq->tail == NULL)
  {
  pq->head = pq->tail = tmp;
  }
  else
  {
  pq->tail->next = tmp;
  pq->tail = tmp;
  }
  pq->size++;
}

2.4数据出队列

队列是先入先出,所以数据是从头节点出去,使用断言此队列不为空,在判断是不是只有一个节点,如果是就直接free掉这个节点即可,再将tai和head置空。如果不止一个节点,则需要保存第二个节点,free掉head,再将head置为下一个节点,最后size--。

void QueuePop(Que* pq)
{
  assert(pq);
  assert(!QueueEmpty(pq));
  if (pq->head->next == NULL)
  {
  free(pq->head);
  pq->head = pq->tail = NULL;
  }
  else
  {
  QNode* next = pq->head->next;
  free(pq->head);
  pq->head = next;
  }
  pq->size--;
}

2.5取队列的头部数据

直接返回head的data即可。

QDataType QueueFront(Que* pq)
{
  assert(pq);
  assert(!QueueEmpty(pq));
  return pq->head->data;
}

2.6取队列的尾部数据

返回tail的data即可。

QDataType QueueBack(Que* pq)
{
  assert(pq);
  assert(!QueueEmpty(pq));
  return pq->tail->data;
}

2.7判断队列是否为空

使用bool的返回值。

bool QueueEmpty(Que* pq)
{
  assert(pq);
  return pq->head == NULL;
}

2.8队列的数据个数

返回size即可。

int QueueSize(Que* pq)
{
  assert(pq);
  return pq->size;
}

今天的分享到这里就结束啦!谢谢老铁们的阅读,让我们下期再见。

相关文章
|
1月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
191 9
|
2月前
|
缓存 算法 调度
数据结构之 - 双端队列数据结构详解: 从基础到实现
数据结构之 - 双端队列数据结构详解: 从基础到实现
92 5
|
2月前
|
存储 算法 搜索推荐
探索常见数据结构:数组、链表、栈、队列、树和图
探索常见数据结构:数组、链表、栈、队列、树和图
117 64
|
24天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
45 5
|
1月前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
2月前
初步认识栈和队列
初步认识栈和队列
65 10
|
2月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
27 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
2月前
|
存储 安全 Java
【用Java学习数据结构系列】探索栈和队列的无尽秘密
【用Java学习数据结构系列】探索栈和队列的无尽秘密
37 2
【数据结构】--- 栈和队列
【数据结构】--- 栈和队列
|
2月前
|
消息中间件 存储 Java
数据结构之 - 深入探析队列数据结构: 助你理解其原理与应用
数据结构之 - 深入探析队列数据结构: 助你理解其原理与应用
40 4