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

news2025/1/13 3:34:00

本文主要内容:介绍了队列的基本概念和基本操作,详细介绍了队列的顺序存储和链式存储。并介绍了循环队列双端队列(以及输入/输出受限的双端队列),及其基本操作

目录

  • 队列
    • 一、队列的基本概念
      • 1、基本概念
      • 2、基本操作
    • 二、队列的顺序存储结构
      • 1、队列的顺序存储
      • 2、循环队列
        • 1、循环队列的基本操作
          • (1)初始化
          • (2)判队空
          • (3)入队
          • (4)出队
    • 三、队列的链式存储结构
      • 1、队列的链式存储
      • 2、链式队列的基本操作
        • 1)初始化
        • 2)判队空
        • 3)入队
        • 4)出队
    • 四、双端队列

队列

一、队列的基本概念

1、基本概念

只允许在表的一端进行插入,而在表的另一端进行删除。插入端称为队尾,删除端称为队头。插入元素称为入队,删除元素称为出队。

这与我们日常生活中的排队一致,最早排队的最早离队。

队头(Front):允许删除的一端
队尾(Rear):允许插入的一端
空队列:不含任何元素的空表

2、基本操作

InitQueue(&Q)//初始化队列,构造一个空队列Q
QueueEmpty(Q)//判队列空,若队列Q为空返回true,否则返回false
EnQueue(&Q,x)//入队,若队列Q未满,将x加入,使之成为新的队尾
DeQueue(&Q,&x)//出队,若队列Q非空,删除队头元素,并用x返回
GetHead(Q,&x)//读队头元素,若队列Q非空,则将队头元素赋值给x

二、队列的顺序存储结构

1、队列的顺序存储

队列的顺序实现是指分配一块连续的存储单元存放队列中的元素,并附设两个指针:队头指针front指向队头元素,队尾指针rear指向队尾元素(或指向队尾元素的下一个位置)
队列的顺序存储类型:

#define MaxSize 50//队列中元素的最大个数
typedef struct{
	ElemType data[MaxSize];
	int front,rear;//队头指针和队尾指针
}SqQueue;

初始状态(队空条件):Q.front== Q.rear== 0
进队操作:队不满时,先送值到队尾元素,再将队尾指针+1(队尾指针指向队尾元素的下一个位置)
出队操作:队不空时,先取队头元素值,再将队头指针+1

队列的初始状态和出队入队操作如下图所示。队列的初始状态有Q.front== Q.rear== 0成立。可以用Q.front ==Q.rear作为队列判空的条件,但不能用Q.rear ==MaxSize作为队列满的条件,如下图中的最后一种情况,满足Q.rear ==MaxSize但队列不是满的,这种情况称为“上溢出”,但不是真正的溢出,所以是一种假溢出。
队列的出队和入队

2、循环队列

把存储队列元素的表从逻辑上视为一个环,称为循环队列。当队首指针Q.front=MaxSize-1后,再前进一个位置就自动到0,可以利用除法取余运算(%)来实现。
初始时:Q.front=Q.rear=0
队首指针进1:Q.front=(Q.front+1)%MaxSize
队尾指针进1:Q.rear=(Q.rear+1)%MaxSize
队列长度:(Q.rear+MaxSize-Q.front)%MaxSize
出队入队时:指针都按顺时针方向进1
循环队列出队入队的操作如下图所示:
循环队列
为了区分队空和队满,常常牺牲一个一个存储单元来区分是队空还是队满:
队满条件:(Q.rear+1)%MaxSize ==Q.front
队空条件:Q.front ==Q.rear
队列中元素的个数:(Q.rear-Q.frront+MaxSize)%MaxSize

此外,还有其他方式(不牺牲队列的存储单元)可以判断对空队满:
1.增设表示元素个数的数据成员Q.size
队空的条件为Q.size ==0&&Q.front ==Q.rear
队满的条件为Q.size ==MaxSize&&Q.front ==Q.rear
2.增设tag数据成员
因为只有删除操作会导致队空,只有插入操作会导致队满,所以在每次删除操作后将tag置为0,在每次插入操作后将tag置为1。
队空条件:tag ==0&&Q.front ==Q.rear
队满条件:tag ==1&&Q.front ==Q.rear

1、循环队列的基本操作

(1)初始化
void InitQueue(SqQueue &Q){
	Q.rear=Q.front=0;//初始化队首、队尾指针
}
(2)判队空
bool isEmpty(SqQueue Q){
	if(Q.rear==Q.front) return true;
	else return false;
}
(3)入队
bool EnQueue(SqQueue &Q,ElemType x){
	if((Q.rear+1)%MaxSize==Q.front) return false;
	Q.data[Q.rear]=x;
	Q.rear=(Q.rear+1)%MaxSize;//更新队尾指针
	return true;
}
(4)出队
bool DeQueue(SqQueue &Q,ElemType &x){
	if(Q.rear==Q.front) return false;
	x=Q.data[Q.front];
	Q.front=(Q.front+1)%MaxSize;//更新队头指针
	return true;
}

三、队列的链式存储结构

1、队列的链式存储

队列的链式表示称为链队列。单链表的头指针指向队头结点,尾指针指向队尾结点(单链表的最后一个结点)。
队列的链式存储如下图所示。通常将链式队列设计成一个带头结点的单链表
队列的链式表示

2、链式队列的基本操作

1)初始化

void InitQueue(LinkQueue &Q){
	Q.front=Q.rear=(LinkNode*)malloc(sizeof(LinkNode));//建立头结点
	Q.front->next=NULL;//初始化为空
}

2)判队空

bool IsEmpty(LinkQueue Q){
	if(Q.front==Q.rear) return true;
	else return false;	
}

3)入队

void EnQueue(LinkQueue &Q,ElemType x){
	LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode));//创建新结点
	s->data=x;
	s->next=NULL;
	Q.rear->next=s;//插入到表尾
	Q.rear=s;
}

4)出队

bool DeQueue(LinkQueue &Q,ElemType &x){
	if(Q.front==Q.rear) return false;
	LinkNode *p=Q.front->next;//p为头结点后第一个元素
	x=p->data;
	Q.front->next=p->next;//删除元素p
	if(Q.rear==p) Q.rear=Q.front;//p结点是队列中唯一一个元素
	free(p);
	return true;
}

四、双端队列

双端队列是指允许两端都可以进行入队和出队操作的队列。双端队列形式如下图所示:
双端队列
双端队列进队时,前端进的元素排列在队列中后端进的元素的前面,后端进的元素排列在队列中前端进的元素的后面。
双端队列出队时,前端和后端都是先出的元素排列在后出的元素的前面。
【思考,如何由入队序列abcd得到出队序列dcab?见下图所示(答案不唯一)】
双端队列示例
【独立思考,如何由入队序列1234得到出队序列4132?】

双端队列其余比较常见的形式有两种,分别为:输入受限的双端队列和输出受限的双端队列。
顾名思义,输入受限的双端队列允许在一端进行插入和删除,但在另一端只允许删除输出受限的双端队列允许在一端进行插入和删除,但在另一端只允许插入。如下图所示:
输入/输出受限的双端队列
本文内容为个人学习总结所得,如有问题欢迎评论区指正,感谢观看。

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

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

相关文章

计算机视觉-目标检测(二):从R-FCN到YOLO-v3

文章目录 1. R-FCN1.1 动机1.2. R-FCN 网络结构1.3. R-FCN 的损失函数1.4. R-FCN的训练及性能 2. YoLO-v12.1 简介2.2 YOLO-v1网络结构2.3 目标函数2.4 YOLO-v1的优缺点 3. YOLO-v23.1 YOLO-v2相比v1的优化 4. YOLO-v3参考 1. R-FCN 论文链接:R-FCN:Object Detecti…

java格式化数字 NumberFormat及DecimalFormat

一、JavaAPI官方描述 1、NumberFormat NumberFormat帮助您格式化和解析任何区域设置的数字。您的代码可以完全独立于小数点,千位分隔符的区域设置约定,甚至是使用的特定十进制数字,或者数字格式是否为十进制。 2、 DecimalFormat Decimal…

Linux之YUM管理工具

目录 Linux之YUM管理工具 定义 实现YUM的三个机制 RHEL8中yum源变化说明 案例 示例1 --- 建立本地光盘源(本地yum源) 示例2 --- 配置互联网源 yum(dnf)工具管理软件包 安装软件包 module子命令 案例 yum-config-manager的使用 定义 yum-conf…

Linux系统如何配置网络

Linux系统的三种网络模式: 桥接:可以和外部设备通信,主机和Ubuntu分别使用不同的IP地址NAT:可以和外部设备通信,主机和Ubuntu公用一个IP地址主机:只能和主机通信 在此我们介绍如何配置桥接网络&#xff1…

谓词的介绍与基本使用

🚨谓词 🚦概念 1.返回类型为bool的仿函数 2.接受一个参数—一元谓词 接受一个参数—二元谓词 🚀1.一元谓词 ⛽使用方法 因为返回值为bool类型,所以经常会将他使用成判断关系的函数 我们使用find_if()对…

HBase 2.3.7中snappy压缩配置

本文将介绍如何在HBase 2.3.7中配置snappy压缩。snappy是一种快速的数据压缩和解压缩算法,可以提高HBase的存储空间利用率和读写性能。本文将使用HBase 2.3.7版本,运行在三个Ubuntu系统的虚拟机中,分别作为master和slave节点。 主要步骤如下…

【SpringBoot】SpringBoot Starter 作用及原理

文章目录 前言一、什么是 Starter二、Starter 的作用三、spring 整合组件四、spring-boot 整合组件五、Starter 原理 前言 有没有在入行后直接基于 SpringBoot 开发项目,没有 spring、servlet 开发经历的? 有没有用 SpringBoot 开发项目,但是第一次听…

服务注册中心Eureka

服务注册中心Eureka Eureka介绍Eureka 环境搭建Eureka 集群配置Eureka 的自我保护模式Eureka 架构图 Eureka介绍 在微服务架构中,有着许许多多的微服务,微服务之间需要彼此进行远程调用,需要知道彼此的地址,通过人工的方式去管理…

C++算法:加权连通图的最小生成树(Prim)

文章目录 前言一、Prim算法原理二、算法实现1、生成图2、Prim 总结原创文章,未经许可,严禁转载 前言 在前文加权连通图的最小生成树(Kruskal)中已经用以边找点的方式实现最小生成树的生成。Prim算法也是一种常用的最小生成树算法,和Kruskal不…

python 妙笔生花

1.学习编程好处 最主要的好处就是,思考问题的方式变得更加具有逻辑性。 日常我们敲代码时,需要思考每一行的代码执行效果,它就需要认真设计每行代码可用性。如果在设计上发生错误,在代码执行时就会报错。还能做到 触类旁通。 古语有云: 有道无术,术可求,有术无道,止于术…

armbian可视化查看系统的使用情况

文章目录 armbian查看系统的使用情况在终端可视化查看方式htop简介htop安装和使用的步骤 在浏览器可视化查看方式 armbian查看系统的使用情况 在终端可视化查看方式 htop简介 htop’是一款任务管理器和系统监视工具,可在Armbian Linux中使用。它提供了比默认任务…

Python使用多线程操作tif影像和HBase数据库

本文介绍使用Python的多线程技术,提高happybase模块和gdal模块的效率,从tif格式的影像文件中读取数据,并将其存储到HBase数据库中。主要步骤包括: 准备工作:安装Python环境,安装happybase模块和gdal模块&a…

windows安装jdk1.8

1.下载jdk8 https://www.oracle.com/java/technologies/downloads/#java8-windows 百度网盘: 链接: https://pan.baidu.com/s/1qtVZ3Rsa1_n9XsFcXj07rA 提取码: yhwc 2.双击以后进行JDK的安装 操作前先在D盘保存java文件夹,里面新建jdk1.8.0_241文件…

AntDB 替换某省电信大数据平台的案例分享

亚信自研分布式数据库AntDB落地某省电信的案例分享 整体介绍 某省电信大数据分析平台,需要对BSS的三户、订单、实例等近10TB级的数据进行快速分析统计,每次分析的数据量最高达到5亿级别,同时需要向其它厂商开放这种实时的数据分析能力&…

Java-API简析_java.util.Currency类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://blog.csdn.net/m0_69908381/article/details/131255544 出自【进步*于辰的博客】 其实我的【Java-API】专栏内的博文对大家来说意义是不大的。…

对象实例化空指针处理

1 问题 如何解决对象实例化空指针异常? 2 方法 首先创建一个package包,将其Menu类及相关代码放入其中,并在该package包下创建另一个类MenuItem,然后通过构造函数,写入需要运行的对象信息,最后在Menu类中用n…

leetcode 151. 反转字符串中的单词

2023.6.14 这道题全面考察了字符串的一些操作,这里我的思路是: 先对字符串进行空格去除操作,这里要注意一个细节:先用for循环去除连续空格,再用if判断开头和结尾的空格。再对没有异常空格的s 做一个反转操作。再对每一…

计算机网络基础知识(九)—— 什么是TelnetS?Telnet Over TLS

文章目录 01 | TelnetS02 | OpenSSL03 | 实现思路服务器处理流程客户端处理流程 04 | 代码实现服务端代码客户端代码编译过程 & 执行结果 前面学习了什么是HTTPS协议,了解了HTTPS的工作原理以及具体的工作流程,了解了HTTP协议和HTTPS协议之间的区别。…

SSM框架搭建

SSM环境搭建 1 IDE的话,我用的MyEcplise,如果用Ecplise的话,需要自行配置服务器。 首先,建一个Dynamic工程,需要注意的是一定要勾选上web.xml。 将Spring框架包、jstl包、standard包、common-logging包、aopallian…

系列十三、MongoDB聚合查询

一、概述 MongoDB聚合框架(Aggregation Framework)是一个计算框架,它可以: ①:作用在一个或者几个集合上; ②:对集合中的数据进行一系列的运算; ③:将这些数据转化为期望的形式; 从效果而言…