队列的实现和基本操作

news2024/11/25 13:20:27

队列的表示和实现


  <队列是仅在表尾进行插入操作,在表头进行删除操作的线性表;
  <表尾即an端,表头即a1端;(也称作队尾队头)
  <它是一种先进先出的(FIFO)线性表
  <例如Q(a1,a2,a3,......,an),a1为队头,an为队尾;
  <插入元素称作入队,删除元素称作出队;
  <队列的存储结构为顺序队或者链队;

队列的顺序表示

#define MAXQSIZE 1000           //最大的队列长度
Typedef struct{
	QElemType *base;            //初始化队列动态分配存储空间 
	int front;                  //头指针 
	int rear;                   //尾指针 
}SqQueue;

 队列在内存中的存储情况如图1:

 图1 队列在内存中的存储情况 

 这里的front和rear虽然是int类型,但是其功能与指针类似。


 下面简单介绍一下队列的入队:

  front==0且rear==MAXQSIZE;再入队,真溢出;
  front!=0且rear==MAXQSIZE;再入队,假溢出;
  
//解决假溢出的方法
/*<1>将队中元素依次向队头方向移动
(缺点:浪费时间,每移动一次,队中元素都要移动)
  <2>将队空间想象成一个循环表
  即分配给队列的m个存储单元可以循环使用,
  当rear为MAXQSIZE时,若队列的开始端空着,又可以从头使用空着的空间
  当front为MAXSIZE时,若队列的开始端空着,又可以从头使用空着的空间
  <3>引入循环队列*/

  
循环队列的操作


/*

base[0]接在base[MAXQSIZE-1]之后,相当于一个圈
  若rear+1==MAXQSIZE,令rear=0;
  插入元素:Q.base[Q.rear]=x;
            Q.rear=(Q.rear+1)%MAXQSIZE;
  删除元素:x=Q.base[Q.front];
            Q.front=(Q.front+1)%MAXQSIZE;
*/  

循环队列的存储情况如图2所示:

图2 循环队列在内存中的存储情况

Q.rear=(Q.rear+1)%MAXQSIZE;

Q.front=(Q.front+1)%MAXQSIZE;  

因为内存下标是从0开始的,所以要加一

  

 那么循环队列中队空、队满的标志是什么呢?

有没有发现在循环队列中队空、队满的标志都是front==rear;

那么我们该如何区分队空、队满呢?

其实很简单,只需要空出一个元素空间即可,如图3:

图三 空出一个元素空间后的存储情况

队空:front==rear;

队满:(rear+1)%MAXQSIZE==front;

循环队列的操作

队列的初始化(相当建立一个空的队列)

//队列的初始化
Status InitQueue(SqQueue Q){
	Q.base=(QElemType *)malloc(sizeof(QElemType)*MAXQSIZE);
	if(!Q.base){
		return OVERLOW;
	}
	else{
		Q.front=Q.rear=0;           //front和rear相当于指针
		return OK; 
	}
} 
 

求队列长度


int QueueLength(SqQueue Q){
	return ((Q.rear-Q.front+MAXQSIZE)%MAXQSIZE);
} 

 

若rear-front<0,那么rear-front的绝对值表示该表中元素个数与MAXQSIZE的差值,即空格个数,

rear-base+MAXQSIZE可以表示该表中元素个数

若rear-front>0,那么rear-front可以直接表示该表中元素个数
  

 循环队列在内存中的几种存储情况如图4所示:

图4 循环队列中的几种存储情况

 

循环队列入队


Status EnQueue(SqQueue Q,QElemType e){
	if((Q.rear+1)%MAXQSIZE==0){
		return ERROR;                    //队满 
	}
	Q.base[Q.rear]=e;
	Q.rear=(Q.rear+1)%MAXSIZE;
	return OK; 
} 

队列入队只在队尾进行,相较于单链表的插入简单很多

但要注意,要判断是否队满

循环队列出队


Status DEQueue(SqQueue Q,QElemType e){
	if(Q.front==Q.rear){
		return ERROR;                  //队空 
	}
	e=Q.base[Q.front];
	Q.front=(Q.front+1)%MAXQSIZE;
	return OK; 
} 
 

 队列出队只在队头进行

应判断是否队空

取队头元素


SElemType GetHead(SqQueue Q){
	if(Q.front!=Q.rear){              //队列不为空 
		return Q.base[Q.front];
	}
} 

可以直接访问头指针所指向的元素

 //注意:返回的只是队头元素的值,队头指针不变

队列的链式表示和实现

链队列的类型定义


#define MAXQSIZE 100
typedef struct Qnode{
	QElemType data;
	struct Qnode * next;
}QNode,*QueuePtr;

typedef struct{
	QueuePtr front;          //队头指针 
	QueuePtr rear;           //队尾指针 
}LinkQueue; 

这里的front相当于单链表里的头结点

 链队列的初始化


Status InitQueue(LinkQueue Q){
	Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
	Q.front->next=Q.rear->next=NULL;
	return OK;
}
  

相当于建立一个空队

  
链队列的销毁


Status DestoryQueue(LinkQueue Q){
	while(Q.front){
		p=Q.front->next;
		free(Q.front);
		Q.front=p;
	}
	return OK;
} 
 

销毁与单链表类似,表中所有东西都不存在,包括头结点

链队列的入队


Status EnQueue(LinkQueue Q,QElemType e){
	p=(QueuePtr)malloc(sizeof(QNode));
	if(!p){
		return OVERLOW;
	}
	p->data=e;
	p->next=NULL;
	Q.rear->next=p;
	Q.rear=p;
	return OK;
} 

队列只能在队尾入队,相比于单链表,链队多了一个尾指针,所以操作起来很简单

链队列出队


Status DeQueue(LinkQueue Q,QElemType e){
	if(Q.front==Q.rear){
		return ERROR;
		}                 //队空
		QNode * p;
		p=Q.front->next;
		e=p->data;
		Q.front->next=p->next;
		if(Q.rear==p){    //如果队中只有一个元素,删除后需要修改指针 
			Q.rear=Q.front;
		}
        free (p);
		return OK; 
	}
} 
 

队列的出队只能在队头进行,相当于删除用第一个数据元素所在的结点

其详细过程如图5所示:

图5 链队出队过程详解 

取队头元素


Status GetHead(LinkQueue Q,QElemType e){
	if(Q.front==Q.rear){
		return ERROR;
	}
	e=Q.front->next->data;
	return OK;
} 
 

取队头元素可以直接访问头指针

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

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

相关文章

【中介者模式】设计模式系列:解锁高效协作的秘密武器(设计实战)

文章目录 中介者模式在Java中的应用与实践1. 引言2. 中介者模式解析2.1 模式的基本概念2.2 中介者模式的角色说明2.3 模式的工作原理2.4 UML类图和时序图展示2.5 模式的优点与缺点2.6 模式的变体和扩展 3. 实现细节3.1 Java代码示例3.2 示例应用分析3.3 代码解释 4. 应用场景5.…

css中使用@property自定义属性,实现闪烁渐变背景【2024新属性】

自 2024 年 7 月起&#xff0c;此功能适用于最新的设备和浏览器版本。此功能可能无法在较旧的设备或浏览器中使用。 property 是 CSS 中一个相对较新的功能&#xff0c;主要用于定义自定义属性&#xff08;即 CSS 变量&#xff09;的类型、继承性以及初始值。它允许开发者更好地…

linux使用nginx部署springboot + vue分离项目

第一步,打包后端项目 maven打包springboot项目为jar文件,上传到服务器,然后运行此jar,具体操作参考: centos部署jar包_centos jar 静态资源文件-CSDN博客 第二步,安装nginx 具体操作自行查找,相关命令: 启动: /usr/local/nginx/sbin/nginx 重新加载配置: /usr…

[数据集][目标检测]木材缺陷检测数据集VOC+YOLO格式2383张10类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2383 标注数量(xml文件个数)&#xff1a;2383 标注数量(txt文件个数)&#xff1a;2383 标注…

PyQt5基础控件

一、按钮 (一)普通按钮QPushButton 1.创建按钮控件 QPushButton()&#xff1a;创建一个无父控件的按钮控件QPushButton(parent)&#xff1a;创建控件的同时, 设置父控件QPushButton(text, parent)&#xff1a;创建控件的同时, 设置提示文本和父控件QPushButton(icon, text, …

自定义组件上传到maven中央仓库2024实测可用最详细版

自 2024 年 3 月 12 日起&#xff0c;官方调整了发布的方式&#xff0c;所有发布都必须通过中央门户&#xff0c;以往老方式可能不适用&#xff0c;以下记录2024新版上传发布方式 注册sonatype账号 Maven中央仓库并不支持直接发布jar包&#xff0c;sonatype是其指定的第三方仓…

【Python】函数进阶(上)

本篇文章将讲解函数进阶的知识&#xff1a; &#xff08;1&#xff09;函数的补充 &#xff08;2&#xff09;函数名是什么 &#xff08;3&#xff09;返回值和print &#xff08;4&#xff09;函数的作用域 1、函数的补充 &#xff08;1&#xff09;参数内存地址相关 如何查…

【算法专题】滑动窗口类

个人主页&#xff1a;CSDN_小八哥向前冲~ 所属专栏&#xff1a;算法基础入门 目录 长度最小的子数组 无重复字符的最长子串 最大连续1的个数 将x减到0的最小操作数 水果成篮 找到字符串中所有字母异位词 最小覆盖字串 长度最小的子数组 题目&#xff1a;【LeetCode】长度…

Python生成432Hz音频

使用 numpy 来生成信号&#xff0c; 使用 matplotlib 可视化信号&#xff0c; 使用 sounddevice 播放声音。 以下生成和播放 432 Hz 的正弦波信号&#xff1a; import numpy as np import sounddevice as sd import matplotlib.pyplot as plt# 生成单音函数 def generate_to…

订单完工数量超过了最大可完工数量

本次完工将造成订单YWS-24070027产出实际完工数量达到了6093.000000000&#xff0c;超过了最大可完工数量5000.000000000 一个成品入库单被它们玩坏了。生产不知道生产了什么。PMC不知道要入库什么。鸡同鸭天天开会之后结果就是单据重复的开立&#xff0c;删除&#xff0c;开立…

C++ TinyWebServer项目总结(5. Linux网络编程基础API)

还是给我的语雀文档打个广告&#xff1a; 《5. C TinyWebServer项目总结&#xff08;5. Linux网络编程基础API&#xff09;》我的文章都是先在语雀里记录的&#xff0c;然后再同步发送到CSDN上&#xff0c;有些格式问题实在是懒得改了&#xff0c;可能会导致大家看的不舒服&…

自行车制造5G智能工厂工业物联数字孪生平台,推进制造业数字化

在当今这个日新月异的数字化时代&#xff0c;制造业正经历着前所未有的变革&#xff0c;自行车制造5G智能工厂工业物联数字孪生平台的兴起&#xff0c;无疑是这场转型浪潮中一股强劲力量。自行车制造5G智能工厂工业物联数字孪生平台的成功应用&#xff0c;不仅仅是技术上的突破…

代码随想录DAY21 - 二叉树 - 08/20

目录 修建二叉搜索树 题干 思路和代码 递归法 迭代法 将有序数组转化为平衡二叉搜索树 题干 思路和代码 递归法 递归优化 迭代法 把二叉搜索树转换为累加树 题干 思路和代码 递归法 迭代法 修建二叉搜索树 题干 题目&#xff1a;给你二叉搜索树的根节点 root …

数据结构【顺序结构二叉树:堆】(1)

​​​​​​​ &#x1f31f;个人主页&#xff1a;落叶 目录 ​ &#x1f525;树的概念与结构​​​​​​​ &#x1f525;树的表⽰ &#x1f525;孩⼦兄弟表⽰法&#xff1a; &#x1f525;树形结构实际运⽤场景 &#x1f525;⼆叉树 &#x1f525;概念与结构 &…

day4JS-数组

1. 什么是数组 数组是值的有序集合。每个值叫做一个元素。每个元素在数组中有一个位置, 以数字表示,称为索引 (有时也称为下标)。数组的元素可以是任何类型。数组索引从 0 开始,数组最大能容纳 4294967295 个元素。 2. 数组的声明与使用 2.1 使用字面量的方式声明数组 语法…

Minio web控制台实现授权管理

启动minio ./minio server /data01/aidacp/apps/minio/data --config-dir /data01/aidacp/apps/minio/conf --address 127.0.0.1:19090 --console-address 127.0.0.1:19091 &WARNING: Detected Linux kernel version older than 4.0.0 release, there are some known pote…

建设项目跟踪与展示系统

这是在翻旧文件时翻到的16年写的一个项目 建设项目跟踪与展示系统 建设方案 一、系统建设目的及意义 建设工程项目进度控制的最终目的是确保建设项目按预定的时间完成。能否在预定的时间内交付使用&#xff0c;直接影响到投资效益。为解决施工组织过程中存在问题&#xff0c;…

PyTorch深度学习实战(25)—— 使用向量化思想解决实际问题

本文将实际应用向量化思想解决深度学习中的几个经典问题,读者可以在这些示例中进一步领悟向量化思想和高级索引思想。 1. Box_IoU Box_IoU是目标检测任务中最基本的评价指标。简单来说,Box_IoU就是模型预测的检测结果框(predicted bbox)与原始标记框(ground truth)之间的…

企业级Nginx源码安装及其实战讲解

一&#xff1a;web服务基础介绍 1.1Web服务介绍 Apache 经典的 Web 服务端 Apache起初由美国的伊利诺伊大学香槟分校的国家超级计算机应用中心开发 目前经历了两大版本分别是1.X和2.X 其可以通过编译安装实现特定的功能 Apache prefork 模型 预派生模式&#xff0c;有一个…

[C++进阶]map和set

一、关联式容器 STL中的部分容器&#xff0c;比如&#xff1a;vector、list、deque、forward_list(C11)等&#xff0c;这些容器统称为序列式容器&#xff0c;因为其底层为线性序列的数据结构&#xff0c;里面存储的是元素本身。 那什么是关联式容器&#xff1f;它与序列式容器…