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

队列

队列(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,一经查实,立即删除!

相关文章

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;也就是说&…

【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…

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 亚里士多德的说…

【自动驾驶技术】自动驾驶汽车AI芯片汇总——地平线篇

0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我自己学习的理解&#xff0c;虽然参考了他人的宝贵见解及成果&#xff0c;但是内容可能存在不准确的地方。如果发现文中错误&#xff0c;希望批评指正&#xff0c;共同进步。 本篇文章是这个系列的第二篇&#x…

50个常用的Docker命令及如何使用

这里整理了50个常用的Docker命令以及每个命令的使用方法。 docker version:显示Docker版本信息。 示例:docker version docker info:显示Docker系统信息。 示例:docker info docker pull <image>:从Docker Hub下载镜像。 示例:docker pull ubuntu docker run <i…

CMake编译安装、生成可执行程序、生成静态动态库以及静态动态库的链接

1 CMake介绍 CMake是一个开源的、跨平台的构建系统&#xff0c;用于管理软件从源代码到可执行文件的整个构建过程。它最初由Kitware公司为ITK&#xff08;Insight Segmentation and Registration Toolkit&#xff09;和VTK&#xff08;Visualization Toolkit&#xff09;等开源…

在Linux kali下载、安装Perl环境

目录 Perl介绍 下载安装 官网下载 在Windows安装 在Linux和Mac OS安装 Perl介绍 Perl一种功能丰富的计算机程序语言&#xff0c;运行在超过100种计算机平台上&#xff0c;适用广泛&#xff0c;从最初是为文本处理而开发的&#xff0c;现在用于各种任务&#xff0c;包括系统…

面试官:Spring中都应用了哪些设计模式?

设计模式是我们项目中经常会涉及到的项目进行重构、解构时的一种方法。 比如我们常见的单例模式、工厂模式、策略模式、装饰器模式等都是比较常用的&#xff1b;关于 23 种设计模式&#xff0c;大家可以找本书专门去学习一下&#xff0c;在 Java 框架的源码中也不例外&#xf…

如何用python做一个用户登录界面——浔川python社

1 需解决的问题&#xff1a; 1.1如何用python做一个用户登录界面&#xff1f; 1.2需要用到哪些库、模块&#xff1f; 2 问题解决&#xff1a; 2.1 回答 1.1 &#xff1a;合理即可&#xff0c;无标准回答。 2.2 回答 1.2 &#xff1a;tk库&#xff08;缩写&#xff09;、GUL界面…

C++20实战之channel

C20实战之channel 继前面两节的直播&#xff0c;讲解了thread、jthread、stop_token、stop_source、stop_callback、cv、cv_any等的用法与底层实现&#xff0c;那么如何基于这些知识实现一个小项目呢&#xff1f; 于是引出了这篇&#xff0c;写一个channel出来。 注&#xff1a…