队列——一种操作受限的线性表

队列

队列(Queue)简称队,也是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除。向队列中插入元素称为入队或进队,删除元素称为出队或离队。队列中的元素是先进先出(First In First Out,FIFO)。

队头(Front):允许删除的一端,又称队首。

队尾(Rear):允许插入的一端。

		————————————————————
出队列<---- a1 a2 a3 a4 a5 <-----入队列————————————————————^				^|				|队头			 队尾

循环队列

用数组实现循环队列

#define MAX_SIZE 6
typedef int ElemType;
typedef struct {// 数组 存储MAX_SIZE - 1个元素ElemType data[MAX_SIZE];// 队列头 队列尾int front, rear;
} SqQueue;

请添加图片描述

#include <stdio.h>#define MAX_SIZE 6
typedef int ElemType;
typedef struct {// 数组 存储MAX_SIZE - 1个元素ElemType data[MAX_SIZE];// 队列头 队列尾int front, rear;
} SqQueue;/** 初始化循环队列*/
void init_queue(SqQueue &Q) {// 初始化循环队列: 让头部和尾部都指向零号Q.front = Q.rear = 0;
}/** 判断循环队列是否为空*/
bool queue_empty(SqQueue Q) {return Q.front == Q.rear;
}/** 入队*/
bool enqueue(SqQueue &Q, ElemType data) {// 判断队列是否已满if ((Q.rear + 1) % MAX_SIZE == Q.front) {return false;}// 放入元素Q.data[Q.rear] = data;// rear加1Q.rear = (Q.rear + 1) % MAX_SIZE;return true;
}/** 出队*/
bool dequeue(SqQueue &Q, ElemType &elem) {// 判断队列是否为空if (queue_empty(Q)) {return false;}// 队首元素elem = Q.data[Q.front];// front加1Q.front = (Q.front + 1) % MAX_SIZE;return true;
}int main() {SqQueue Q;// 一、初始化循环队列init_queue(Q);// 二、判断循环队列是否为空bool ret = queue_empty(Q);if (ret) {printf("queue is empty\n");}// 三、入队enqueue(Q, 3);enqueue(Q, 4);ret = enqueue(Q, 5);if (ret) {printf("enqueue success\n");} else {printf("enqueue failed\n");}// 四、出队ElemType elem;ret = dequeue(Q, elem);if (ret) {printf("dequeue succes, elem = %d\n", elem);} else {printf("dequeue failed\n");}enqueue(Q, 6);enqueue(Q, 7);enqueue(Q, 8);ret = enqueue(Q, 9);return 0;
}

队列

队列的链式表示称为链队列,它实际上是一个同时带有队头指针和队尾指针的单链表。头指针指向队头结点,尾指针指向队尾结点,即单链表的最后一个结点。

链表尾插法实现入队,链表头删法实现出队。

请添加图片描述

#include <stdio.h>
#include <stdlib.h>typedef int ElemType;
typedef struct LinkNode {ElemType data;struct LinkNode *next;
} LinkNode;// 链表 先进先出
typedef struct LinkQueue {// 链表头/队头 链表尾/队尾LinkNode *front, *rear;
} LinkQueue;/** 队列的初始化(带头结点的链表实现)*/
void init_queue(LinkQueue &Q) {// 头和尾指向同一个结点Q.front = Q.rear = (LinkNode *) malloc(sizeof(LinkNode));// 头结点的next指针为NULLQ.front->next = NULL;
}/** 判断队列是否为空*/
bool queue_empty(LinkQueue Q) {if (Q.front == Q.rear) {return true;}return false;
}/** 入队*/
void enqueue(LinkQueue &Q, ElemType data) {LinkNode *new_node = (LinkNode *) malloc(sizeof(LinkNode));new_node->data = data;new_node->next = NULL;// 尾指针的next指向new_nodeQ.rear->next = new_node;// rear指向新的尾部Q.rear = new_node;
}/** 出队*/
bool dequeue(LinkQueue &Q, ElemType &elem) {// 判断队列是否为空if (queue_empty(Q)) {return false;}// 第一个结点LinkNode *q = Q.front->next;elem = q->data;Q.front->next = q->next;// 链表只剩一个结点时 被删除后 要改变rearif (Q.rear == q) {Q.rear = Q.front;}//让第一个结点断链free(q);return true;
}int main() {// 新建队列LinkQueue Q;// 一、初始化队列init_queue(Q);// 二、判断队列是否为空bool ret = queue_empty(Q);if (ret) {printf("queue is empty\n");}// 三、入队enqueue(Q, 3);enqueue(Q, 4);enqueue(Q, 5);// 四、出队ElemType elem;dequeue(Q, elem);dequeue(Q, elem);ret = dequeue(Q, elem);if (ret) {printf("dequeue success element = %d\n", elem);} else {printf("dequeue failed\n");}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/20937.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大聪明教你学Java | 深入浅出聊 Stream.parallel()

前言 &#x1f34a;作者简介&#xff1a; 不肯过江东丶&#xff0c;一个来自二线城市的程序员&#xff0c;致力于用“猥琐”办法解决繁琐问题&#xff0c;让复杂的问题变得通俗易懂。 &#x1f34a;支持作者&#xff1a; 点赞&#x1f44d;、关注&#x1f496;、留言&#x1f4…

MySQL学习——选项文件的使用

MySQL 的许多程序都可以从选项文件&#xff08;有时也被称为配置文件&#xff09;中读取启动选项。选项文件提供了一种方便的方式来指定常用的选项&#xff0c;这样你就不必每次运行程序时都在命令行上输入这些选项。 要确定一个程序是否读取选项文件&#xff0c;你可以使用 -…

man命令的作用

man命令是Linux操作系统中一个非常实用的命令&#xff0c;它用于查看命令的手册页面&#xff0c;帮助用户了解特定命令的用法、选项和参数。这不仅对新用户在学习如何使用新命令时很有帮助&#xff0c;也方便了经验丰富的用户快速查找命令的详细信息。以下是具体介绍&#xff1…

[论文精读]Supervised Community Detection with Line Graph Neural Networks

论文网址:[1705.08415] Supervised Community Detection with Line Graph Neural Networks (arxiv.org) 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 ⭐内涵大量可视…

高速模拟信号链的设计学习

目录 概述&#xff1a; 定义&#xff1a; 断开&#xff1a; 链路设计&#xff1a; 结论&#xff1a; 概述&#xff1a; 由于对共模参数及其与设备之间的关联缺乏了解&#xff0c;客户仍然会提出许多技术支持问题。ADC数据表指定了模拟输入的共模电压要求。关于这方面没有太…

jenkins应用2

1.jenkins应用 1.jenkins构建的流程 1.使用git参数化构建&#xff0c;用标签区分版本 2.git 拉取gitlab远程仓库代码 3.maven打包项目 4.sonarqube经行代码质量检测 5.自定义制作镜像发送到远程仓库harbor 6.在远程服务器上拉取代码启动容器 这个是构建的整个过程和步骤…

C# 反射类Assembly 程序集(Assembly)用法

常见的两种程序集&#xff1a; 可执行文件&#xff08;.exe文件&#xff09;和 类库文件&#xff08;.dll文件&#xff09;。 在VS开发环境中&#xff0c;一个解决方案可以包含多个项目&#xff0c;而每个项目就是一个程序集。 他们之间是一种从属关系&#xff0c;也就是说&…

java —— 匿名内部类与 Lambda 表达式

一、匿名内部类 匿名内部类是一种没有名称的类&#xff0c;多用于只使用一次的情况&#xff0c;本质上就是其所继承的父类或接口的一个子类。 &#xff08;一&#xff09;继承普通类的情况 public class Test{public void method(){System.out.println("通用方法"…

Python与Android连接:深入探索与实现

Python与Android连接&#xff1a;深入探索与实现 在现代移动应用开发领域&#xff0c;Python和Android的结合使用为开发者带来了无限的可能性。这种跨平台的组合不仅拓宽了开发者的视野&#xff0c;也极大地提升了应用的灵活性和可扩展性。本文将从四个方面、五个方面、六个方…

【NLP开发】Python实现聊天机器人(微信机器人)

&#x1f37a;NLP开发系列相关文章编写如下&#x1f37a;&#xff1a;1&#x1f388;【小沐学NLP】Python实现词云图&#x1f388;2&#x1f388;【小沐学NLP】Python实现图片文字识别&#x1f388;3&#x1f388;【小沐学NLP】Python实现中文、英文分词&#x1f388;4&#x1…

转让北京电力施工总承包二级资质变更条件和流程

在电力工程领域&#xff0c;资质等级是企业能否参与竞标、承接工程的重要标志之一。北京电力工程总包二级资质的转让&#xff0c;是指已经取得该资质的企业将其资质转让给需要的企业。这种转让是基于合作与共赢的原则&#xff0c;旨在推动电力工程行业健康、稳定发展&#xff0…

记录使用自定义编辑器做试题识别功能

习惯了将解析写在代码注释&#xff0c;这里就直接上代码啦&#xff0c;里面用到的bxm-ui3组件库是博主基于element-Plus做的&#xff0c;可以通过npm i bxm-ui3自行安装使用 // 识别方法&#xff1a; // dom 当前识别数据所在区域, questionType 当前点击编辑选择的题目类型&a…

力扣刷题--LCR 135. 报数【简单】

题目描述 实现一个十进制数字报数程序&#xff0c;请按照数字从小到大的顺序返回一个整数数列&#xff0c;该数列从数字 1 开始&#xff0c;到最大的正整数 cnt 位数字结束。 示例 1: 输入&#xff1a;cnt 2 输出&#xff1a;[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,1…

codeblock怎么编程:从入门到精通的全面指南

codeblock怎么编程&#xff1a;从入门到精通的全面指南 在数字化时代&#xff0c;编程已成为一项不可或缺的技能。Code::Blocks作为一款流行的开源集成开发环境&#xff08;IDE&#xff09;&#xff0c;为初学者和有经验的开发者提供了强大的编程支持。那么&#xff0c;codebl…

C是结构化编程语言吗:深度剖析与多维度解读

C是结构化编程语言吗&#xff1a;深度剖析与多维度解读 在编程语言的浩瀚海洋中&#xff0c;C语言以其独特的魅力占据着重要的地位。那么&#xff0c;C语言是否可以被归类为结构化编程语言呢&#xff1f;这是一个值得深入探讨的问题。本文将从四个方面、五个方面、六个方面和七…

Qt | Qt 资源简介(rcc、qmake)

1、资源系统是一种独立于平台的机制,用于在应用程序的可执行文件中存储二进制文件(前面所讨论的数据都存储在外部设备中)。若应用程序始终需要一组特定的文件(比如图标),则非常有用。 2、资源系统基于 qmake,rcc(Qt 的资源编译器,用于把资源转换为 C++代码)和 QFile …

java—MyBatis框架

简介 什么是 MyBatis&#xff1f; MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&…

软件公司为什么必须要使用低代码系统?

在当今软件行业全国比较内卷的大环境下&#xff0c;软件公司面临着前所未有的挑战。为了在这个竞争激烈的市场中生存并脱颖而出&#xff0c;驰骋低代码设计者认为&#xff0c;软件公司必须要使用低代码系统。以下是几个关键的原因&#xff1a; 时代发展的必然选择 低代码系统是…

领导力中的说服艺术

本文主要介绍了亚里士多德修辞三角理论&#xff0c;即演讲者在说服听众时如何运用品格&#xff08;Ethos&#xff09;、情感&#xff08;Pathos&#xff09;和逻辑&#xff08;Logos&#xff09;三种基本的修辞手法。原文: The Art of Persuasion in Leadership 亚里士多德的说…

Kubernetes面试题分享

目录 前言 1.Kubernetes的控制平面包括哪些核心组件&#xff1f;它们各自的作用是什么&#xff1f; 2.Kubernetes的数据平面涉及哪些组件&#xff1f;它们如何协作&#xff1f; 3.什么是Pod&#xff1f;为什么它是Kubernetes的基本单元&#xff1f; 4.Service如何实现服务…