queue

news2024/9/25 17:18:55

文章目录

  • 定义
  • 分类
    • 链式队列
    • 静态队列
      • 循环队列
        • 静态队列为什么必须是循环队列?
        • 循环队列需要几个参数?
        • 循环队列入队伪代码
        • 循环队列出队伪代码
        • 判断循环队列是否为空
        • 判断循环队列是否已满
  • 循环队列的代码实现
  • 队列的应用

定义

一种可以实现“先进先出”的存储结构。并且只允许一端入,另一端为出。而且不能对中间的元素进项进行插入删除。在这里插入图片描述栈是先进后出。且只允许在一端插入与删除,就是入口与出口都是同一个。在这里插入图片描述


分类

链式队列

对链表进行一些操作和限制,就成了队列。
在栈当中,头部尾部的代号是Top和Bottom;队列当中,头部尾部的表达式是front和rear。

静态队列

用数组实现,定义头部与尾部之后,也可以实现队列,即把数组的一些功能砍掉,再增加一点队列的功能。静态队列都必须是循环队列

循环队列

需要搞懂:

  1. 静态队列为什么必须是循环队列?
  2. 循环队列需要几个参数来确定?
  3. 循环队列各个参数的含义。
  4. 循环队列入队的伪代码。
  5. 循环队列出队的伪代码。
  6. 如何判断循环队列是否为空。
  7. 如何判断循环队列是否已满。

如果f指向第一个元素,r指向最后一个的话,不好操作,参考链表,链表的第一个是头结点,里面是没有有效元素的。**则现在定义,front指向第一个有效元素的地址,而rear指向最后一个元素的下一个,**错开来,为了方便对队列进行操作。可以理解为两个指针其中有一个指向必须为空,如果首指针指向了一个有效节点,难么尾指针后移一位指,反之一样。
在这里插入图片描述
**front则是用来删除元素的,删除一个元素就往上移一个。**假如front从下往上删除元素,按照链表的思路来说,删除的元素删了,就有空间空闲出来了,但是静态队列不一样,这是基于数组的,数组删除元素后,空间成空闲空间了,无法填充继续使用,造成空间浪费。

**rear是添加元素的,每添加一个元素就网上移一个。**所以无论是删除还是添加,front与rear都往上移动,不论是入队还是出队,这两个参数都是只增不减。

静态队列为什么必须是循环队列?

上述静态队列当中增增删删,那么就会造成rear端溢出(但是CPP不会检查),而front端浪费,并且只能增不能减,造成空间的大量浪费。所以对于这种情况,可以采用循环队列的形式,即当rear已经指向数组最后一个元素时,**那么就可以转而将rear指向数组的第一个空出来的空间。**这就是使用循环队列。
在这里插入图片描述
例如,这种就是循环队列,队列当中有“中 国”两个字符。

循环队列需要几个参数?

两个参数来确定,在不同场合(以下列举三个场合)有不同的含义。建议初学者先记住,再慢慢体会。

  1. 初始化
    front和rear的值都是0
  2. 队列非空
    front代表的是队列第一个元素
    rear代表的是队列最后一个有效元素
  3. 队列空
    front和rear的值相等,但不一定是0

循环队列入队伪代码

具体步骤:

  1. 将值存入当前rear所处的位置
  2. 之后rear = (rear + 1) % length(数组)
    注意此处的错误写法是直接rear = rear + 1。

循环队列出队伪代码

具体步骤:

  1. front = (front + 1) % length(数组)

判断循环队列是否为空

if (front == rear)

如果front和rear的值相等,那么该队列就是空的。

判断循环队列是否已满

在这里插入图片描述

假如数的排布是这样的,现在front是指向了3号,rear是指向了1号,那么front的下一个元素应该指向哪里?是顺时针还是逆时针?参考以上的公式,front = (front + 1) % length(数组),得出结论是4号元素即为front后面的那个元素。

需要注意的是,front与rear是没有规律的,front可以比rear大,这两个是没有任何规律的。

还有一个就是,当front == rear的时候,怎么判断是空了还是满了。

  1. 使用循环队列的小妙招,假如队列只能放 n n n个元素,现在最多放 n − 1 n-1 n1个,剩下一个就空着,这样就好判断是否为满,是否为空。
  2. 多增加一个标识参数。

以上方法常用方法1。用了方法1就使得上方判断队列为空的表达式正确且唯一了。

综上,如果rear和front紧挨着,则队列已满(空出一位)。

if ((r + 1) % (length(数组长度)) == f)
	return;
else
	return 不满;

循环队列的代码实现

#include <iostream>
#include <cmalloc>

using namespace std;

typedef struct Queue{
	int *pBase;
	int front;
	int rear;
}QUEUE;

void init(QUEUE *);
bool en_queue(QUEUE *, int val);
void traverse(QUEUE *);
bool full_queue(QUEUE *);
bool out_queue(QUEUE *, int *);
bool empty_queue(QUEUE *);

int main(){
	QUEUE Q;
	init(&Q);
	en_queue(&Q, 1);
	en_queue(&Q, 2);
	en_queue(&Q, 3);
	en_queue(&Q, 4);
	en_queue(&Q, 5);
	en_queue(&Q, 6);
	
	traverse(&Q);
	out_queue(&Q, &val);
	
	return 0;
} 

//初始化
void init(QUEUE *pQ)
{
	pQ->pBase = (int *)malloc(sizeof(int) * 6);
	pQ->front = 0;
	pQ->rear = 0;
}

//放值
bool en_queue(QUEUE *, int val)
{
	if (full_queue(pQ))
	{
		return false;
	}
	else
	{	pQ->pBase[pQ->rear] = val;
		pQ->rear = (pQ->rear + 1) % (6);
		return true;
	}
}

//判断是否已满
bool full_queue (QUEUE *pQ)
{
	if ((pQ->rear + 1) % 6 == pQ->front)
	{
		return true;
	}
	else
	{
		return false;
	}
}

void traverse(QUEUE *pQ)
{
	int i = pQ->front;
	while (i != pQ->rear)
	{
		cout << pQ->pBase[i] << endl;
		i = (i + 1) % 6;
	}
	return;
}

//出队
bool out_queue(QUEUE *, int *pVal)
{
	if (empty_queue(pQ))
		return false;
	else
	{
		*pVal = pQ->pBase[pQ->front];
		pQ->front = (pQ->front + 1) % 6;
		return true;
	}

}

//判断是否为空
bool empty_queue(QUEUE *pQ)
{
	if (pQ->front == pQ->rear)
		return true;
	else
	{
		return false;
	} 

}

队列的应用

所有和时间有关的操作都与队列有关。

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

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

相关文章

postcss-pxtorem适配插件动态配置rootValue(根据文件路径名称,动态改变vue.config里配置的值)

项目背景&#xff1a;一个项目里有两个分辨率的设计稿(1920和2400)&#xff0c;不能拆开来打包 参考&#xff1a; 是参考vant插件&#xff1a;移动端Vant组件库rem适配下大小异常的解决方案&#xff1a;https://github.com/youzan/vant/issues/1181 说明&#xff1a; 因为vue.c…

Java代码审计7之XSS

文章目录 1、漏洞代码2、修复XSS2.1、单个文件修复2.2、通用过滤 3、一些补充 之前的文章&#xff0c; php代码审计14之XSS 1、漏洞代码 xssServlet.java package com.example.demo; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; im…

windows安装Elasticsearch8.9.0

官网解压安装好路径&#xff08;非中文&#xff0c;无空格&#xff09; 可参考 言之有李LAX csdn http://t.csdn.cn/S2oju本人使用jdk17 修改配置elasticsearch.yml xpack.security.enabled: false xpack.security.http.ssl:enabled: false直接点击bin\elasticsearch.bat…

二叉树的链式结构 - 遍历 - C语言递归实现

前序、中序以及后序遍历 二叉树遍历 (Traversal) 是按照某种特定的规则&#xff0c;依次对二叉 树中的节点进行相应的操作&#xff0c;并且每个节点只操作一次 。 按照规则&#xff0c;二叉树的遍历有&#xff1a; 前序/中序/后序 的递归结构遍历 &#xff1a; 1. 前序遍历(P…

2023天津Java培训学校分享!Java培训班

近年来&#xff0c;各类培训机构如雨后春笋般涌现&#xff0c;其中&#xff0c;Java培训机构可谓是风头正盛&#xff0c;许多想踏入这行的小伙伴选择这个方式来学习Java技能&#xff0c;今天我们一起来讨论一下&#xff1a;学Java有门槛吗&#xff0c;Java培训的好处&#xff0…

问题解决:VS Code环境调试多文件C++程序

在VS code环境下默认可以调试单文件的C程序&#xff0c;如果是多文件的程序&#xff0c;则会出现编译不通过的问题&#xff0c;无法进行调试 解决方法 在VS Code的工程目录下&#xff0c;有一个tasks.json文件 修改tasks.json文件 其中&#xff0c;"args"子项里面…

android app控制ros机器人三(android登录界面)

接下来是二次开发的具体环节了&#xff0c;由于存在用户需求&#xff0c;用到ros-mobile不多&#xff0c;更偏向于android开发。 用ppt画了简单的展示界面&#xff0c;与用后交流界面的功能布局。先开发一代简易版本的app&#xff0c;后续可以丰富完善。ctrlcv上线。 登录界面…

图数据库Neo4j学习三——cypher语法总结

1MATCH 1.1作用 MATCH是Cypher查询语言中用于从图数据库中检索数据的关键字。它的作用是在图中查找满足指定条件的节点和边&#xff0c;并返回这些节点和边的属性信息。 在MATCH语句中&#xff0c;通过节点标签和边类型来限定查找范围&#xff0c;然后通过WHERE语句来筛选符合…

vue+leaflet笔记之地图量测

vueleaflet笔记之地图量测 文章目录 vueleaflet笔记之地图量测开发环境代码简介插件简介与安装使用简介图形量测动态量测 详细源码(Vue3) 本文介绍了Web端使用Leaflet开发库进行距离量测的一种方法 (底图来源:天地图)&#xff0c;结合leaflet-measure-path插件能够快速的实现地…

人工智能术语翻译(四)

文章目录 摘要MNOP 摘要 人工智能术语翻译第四部分&#xff0c;包括I、J、K、L开头的词汇&#xff01; M 英文术语中文翻译常用缩写备注Machine Learning Model机器学习模型Machine Learning机器学习ML机器学习Machine Translation机器翻译MTMacro Average宏平均Macro-F1宏…

高忆管理:msci成分股什么意思?

MSCI&#xff08;Morgan Stanley Capital International&#xff09;是全球领先的金融指数提供商之一&#xff0c;其指数被广泛应用于全球资本商场的出资和危险办理。而MSCI成分股&#xff0c;是指MSCI指数中所包括的股票。那么&#xff0c;MSCI成分股具体意义是什么呢&#xf…

CTFshow-pwn入门-pwn67(nop sled空操作雪橇)

前言 本人由于今年考研可能更新的特别慢&#xff0c;不能把ctfshow的pwn入门题目的wp一一都写出来了&#xff0c;时间比较紧啊&#xff0c;只能做高数做累的时候做做pwn写写wp了&#xff0c;当然我之后只挑典型意义的题目写wp了&#xff0c;其余的题目就留到12月底考完之后再写…

Sugar BI : AI 问答,即问即答

AI 探索功能提供给所有用户自由探索和分析数据模型的能力。在 AI 探索页中&#xff0c;有授权的用户可以通过 AI 问答和字段拖拽两种方式对数据模型进行探索。 下面&#xff0c;我们将为大家详细指导如何使用 AI 探索 新建 AI 探索页 空间管理员可以在报表管理中新建「AI 探索…

短视频矩阵系统源码---开发技术源码能力

短视频矩阵系统开发涉及到多个领域的技术&#xff0c;包括视频编解码技术、大数据处理技术、音视频传输技术、电子商务及支付技术等。因此&#xff0c;短视频矩阵系统开发人员需要具备扎实的计算机基础知识、出色的编程能力、熟练掌握多种开发工具和框架&#xff0c;并掌握音视…

UE Web Remote Control call python script

UE Web Remote Control call python script UE 远程调用Python(UE Python API)脚本 Web Remote Control 在网页客户端远程操作虚幻引擎项目。 虚幻编辑器提供了一套强大的工具&#xff0c;几乎可以操纵项目内容的方方面面。但在某些情况下&#xff0c;要在大型内容编辑流程中…

使用SVM模型完成分类任务

SVM&#xff0c;即支持向量机&#xff08;Support Vector Machine&#xff09;&#xff0c;是一种常见的机器学习算法&#xff0c;用于分类和回归分析。SVM的基本思想是将数据集映射到高维空间中&#xff0c;在该空间中找到一个最优的超平面&#xff0c;将不同类别的数据点分开…

国企普通员工如何才能成为公务员,这三种途径可供参考

国企普通员工如何转变成公务员&#xff1f;作为国企普通员工&#xff0c;如果要成为国家公务员&#xff0c;其主要的路径有三个方面&#xff0c;一是符合国家公务员法规定的公务员招录条件要求的&#xff0c;可以报考国家公务员&#xff1b;二是在国有企业担任领导职务&#xf…

使用EM算法完成聚类任务

EM算法&#xff08;Expectation-Maximization Algorithm&#xff09;是一种基于迭代优化的聚类算法&#xff0c;用于在无监督的情况下将数据集分成几个不同的组或簇。EM算法是一种迭代算法&#xff0c;包含两个主要步骤&#xff1a;期望步骤&#xff08;E-step&#xff09;和最…

子网重叠测试

子网重叠的两个网络可以相互通 虽然子网掩码不同&#xff0c;但是 R1 可以 ping R2&#xff1a; <R1>ping 10.0.12.14PING 10.0.12.14: 56 data bytes, press CTRL_C to breakReply from 10.0.12.14: bytes56 Sequence1 ttl255 time50 msReply from 10.0.12.14: bytes5…

Verilog语法学习——LV4_移位运算与乘法

LV4_移位运算与乘法 题目来源于牛客网 [牛客网在线编程_Verilog篇_Verilog快速入门 (nowcoder.com)](https://www.nowcoder.com/exam/oj?page1&tabVerilog篇&topicId301) 题目 题目描述&#xff1a; 已知d为一个8位数&#xff0c;请在每个时钟周期分别输出该数乘1/…