队列的定义及基本操作实现(链式)

简介: 队列的定义及基本操作实现(链式)

一.队列是什么?🧐🧐🧐


和栈相反,队列( queue)是一种先进先出( First In First Out, FIFO) 的线性表。它只允许在表的一端进行插人,而在另一端删除元素。这和日常生活中的排队是一致的, 最早进入队列的元素最早离开。在队列中,允许插入的一端称为队尾( rear),允许删除的一端则称为队 头( front) 。假设队列为q=(a1,a2, .,an),那么,a就是队头元素, a,则是队尾元素。队列中的元素是按照a, a, … a,的顺序进人的,退出队列也只能按照这个次序依次退出,也就是说,只有在a,a., an,都离开队列之后,a,才能退出队列。


bede318c28c363c91c3feb75b2e103e4_207a6d14876b4048b0fe6d111bf40e25.jpeg


二、队列与线性表的关系🆚🆚🆚


与栈一样队列也是一种重要的线性结构。从数据结构角度看,队列也是线性表,其特殊性在于队列的基本操作是线性表操作的子集,它们是操作受限的线性表,因此,可称为具有限定性的数据结构。但从数据类型角度看,它是和线性表不相同的两类重要的抽象数据类型。


三、队列的基本操作🔬🔬🔬


1.队列的储存结构结构💻


typedef struct Qnode
{
  Elemtype data;
  struct Qnode* next;
}QNode, * QueuePrt;//建立链表
typedef struct
{
  QueuePrt front;
  QueuePrt rear;//指向头和尾的两个指针
}LinkQueue;//建立队列


2.队列的初始化✨


InitQueue(LinkQueue* q)
{
  q->front = q->rear = (QueuePrt)malloc(sizeof(QNode));//创建头结点
  if (!q->front)
  exit(0);
  q->front->next = NULL;
}//初始队列


其实就是链表中的创建头结点


3. 入队🚗


InsertQueue(LinkQueue *q, Elemtype e)
{
  QueuePrt p;
  p = (QueuePrt)malloc(sizeof(QNode));//创建结点
  if (p == NULL)
  exit(0);
  p->data = e;//赋值
  p->next = NULL;//
  q->rear->next = p;//头指针指向下一个结点
  q->rear = p;
}



4.出队🚅


DeletQueue(LinkQueue* q, Elemtype* e)
{
  QueuePrt p;
  if (q->front == q->rear)
  return 0;
  *e = p->data;
  q->front->next = p->next;
  if (q->rear == p)
  q->rear = q->front;
  free(p);
}


5.清空与销毁🆘


DesteoyQueue(LinkQueue* q)
{
  while (q->rear = q->front->next)
  {
  free(q->front);
  q->front = q->rear;
  }
}


总结🎆🎆🎆


队列是一种先进先出的线性表。它只允许在表的一端进行插人, 而在另一端进行删除。队列也有两种存储表示,顺序表示(循环队列)和链式表示( 链队)。队列的主要操作是进队和出队,对于顺序表示的循环队列的进队和出队操作要注意判断队满或队空。凡是涉及队头或队尾指针的修改都要将其对MAXQSIZE求模。


#include<stdio.h>
#include<stdlib.h>
typedef int Elemtype;//定义类型
typedef struct Qnode
{
  Elemtype data;
  struct Qnode* next;
}QNode, * QueuePrt;//建立链表
typedef struct
{
  QueuePrt front;
  QueuePrt rear;//指向头和尾的两个指针
}LinkQueue;//建立队列
InitQueue(LinkQueue* q)
{
  q->front = q->rear = (QueuePrt)malloc(sizeof(QNode));//创建头结点
  if (!q->front)
  exit(0);
  q->front->next = NULL;
}//初始队列
InsertQueue(LinkQueue *q, Elemtype e)
{
  QueuePrt p;
  p = (QueuePrt)malloc(sizeof(QNode));//创建结点
  if (p == NULL)
  exit(0);
  p->data = e;//赋值
  p->next = NULL;//
  q->rear->next = p;//头指针指向下一个结点
  q->rear = p;
}
DeletQueue(LinkQueue* q, Elemtype* e)
{
  QueuePrt p;
  if (q->front == q->rear)
  return 0;
  *e = p->data;
  q->front->next = p->next;
  if (q->rear == p)
  q->rear = q->front;
  free(p);
}
DesteoyQueue(LinkQueue* q)
{
  while (q->rear = q->front->next)
  {
  free(q->front);
  q->front = q->rear;
  }
}
目录
相关文章
|
关系型数据库 MySQL 数据库连接
连接和管理RDS
连接和管理RDS
910 2
|
Kubernetes 负载均衡 网络协议
k8s教程(service篇)-总结(上)
k8s教程(service篇)-总结(上)
333 0
|
存储 算法 C语言
【数据结构】树的基础知识及三种存储结构
文章目录 一、树的概念与定义 二、树的有关名词 三、树的存储结构 1.双亲表示法 2.孩子表示法 3.孩子兄弟表示法(又叫二叉树法) 四、树的应用
|
6月前
|
算法
重磅!2025年中科院预警期刊名单正式发布!
中国科学院文献情报中心发布的《国际期刊预警名单》旨在防范学术不端与不当出版行为,保护科研生态良性发展。2025年版本聚焦两大问题:学术不端(如引用操纵、论文工厂)和不利于中国学术成果国际化传播的行为(如中国作者占比过高或APC费用不合理)。预警名单动态调整,发布时点从年底改为年初,便于科研人员及时调整投稿策略。被列入预警名单的期刊可能影响职称评审及科研经费认可,建议优先选择中科院分区表推荐期刊,警惕“快速代发”陷阱,并关注期刊官网声明。未来科研生态将更注重规范化与原创性,推动高质量学术发表。维护健康的学术环境对提升中国科研全球影响力至关重要。
924 0
|
数据采集 C++ 开发者
掌握VS Code调试技巧:解决Scrapy模块导入中断问题
在使用VS Code调试Scrapy爬虫时,可能会遇到程序在模块导入阶段中断的问题,影响开发效率。本文通过技术分析,探讨了该问题的原因并提供了解决方案,包括正确配置Python路径与`launch.json`文件。此外,以爬取微博数据为例,详细介绍了如何在Scrapy中设置代理IP、Cookie、User-Agent及利用多线程技术提高采集效率。这些技巧有助于优化爬虫性能并在VS Code环境中顺利进行调试工作。
234 2
掌握VS Code调试技巧:解决Scrapy模块导入中断问题
|
11月前
|
数据可视化 算法 Java
JAVA规则引擎工具
本文介绍了六款常用的Java规则引擎:Drools、IBM ODM、Easy Rules、jBPM、OpenL Tablets 和 Apache Camel。每款引擎都有其独特的特点和适用场景,如Drools的高效规则匹配、IBM ODM的Web界面管理、Easy Rules的轻量级特性、jBPM的流程管理、OpenL Tablets的Excel规则定义以及Apache Camel的路由和规则结合。选择合适的规则引擎可以显著提高系统的灵活性和可维护性。
775 0
|
安全 关系型数据库 MySQL
揭秘MySQL海量数据迁移终极秘籍:从逻辑备份到物理复制,解锁大数据迁移的高效与安全之道
【8月更文挑战第2天】MySQL数据量很大的数据库迁移最优方案
1367 17
|
调度 UED
操作系统中的多任务处理机制
【8月更文挑战第23天】在数字时代,操作系统的核心功能之一是多任务处理。它允许用户同时运行多个程序,优化资源使用,并提高生产效率。本文将深入探讨操作系统如何实现多任务处理,以及这一机制对用户体验和系统性能的影响。通过理解多任务处理的工作原理,用户可以更好地管理计算资源,提升个人和组织的工作效率。
|
算法 调度
【操作系统】处理机调度的基本概念和三个层次、进程调度的时机和方式、调度器、闲逛线程
【操作系统】处理机调度的基本概念和三个层次、进程调度的时机和方式、调度器、闲逛线程
1174 3
|
机器学习/深度学习 人工智能 自然语言处理
大模型开发:描述模型可解释性的重要性以及如何实现它。
模型可解释性在AI和机器学习中至关重要,尤其在金融风控等领域,它关乎信任、公平性和法规合规。通过建立信任、发现偏见、排查错误和满足法规要求,可解释性促进了模型的改进和社会接受度。研究者采用简单模型、局部和全局解释方法、模型可视化及原型/反例等策略提升模型透明度。这是一项结合算法、专业知识和伦理的跨学科挑战。
780 1

热门文章

最新文章