数据结构:队列详解 c++信息学奥赛基础知识讲解

news2025/1/10 10:47:40

目录

一、队列概念

二、队列容器

三、队列操作

四、代码实操

五、队列遍历

六、案例实操

题目描述:

输入格式:

输出格式:

输入样例:

输出样例:

详细代码: 


一、队列概念

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
  队尾(rear):只能从队尾添加元素,一般焦作EnQueue,入队
  队头(front):只能从队头移除元素,一般焦作DeQueue,出队
  先进先出的原则、First In Fist Out,FIFO(跟栈是反的,栈是后进先出)
  在生活中队列案例也是随处可见。例如火车站排队买票,银行排队办理业务。

队列:只允许在一端进行插入数据操作,在另一端进行删除操作的特殊线性表,队列最重要的特性是先进先出(First In First Out)

二、队列容器

C++队列queue模板类的定义在<queue>头文件中,queue 模板类需要两个模板参数,一个是元素类型,一个容器类型,元素类型是必要的,容器类型是可选的,默认为deque 类型。C++队列Queue是一种容器适配器,它给予程序员一种先进先出(FIFO)的数据结构。

  队列只需要从对尾插入数据(入队,push_back),对头取数据(出队,pop_front);
  队列只能访问对头和队尾数据,其他数据需要出队才能访问,所以不存在遍历队列;
  返回队列头数据:front()
  返回队列尾数据:back()

三、队列操作

        队列的操作有:入队: 通常命名为push(),出队: 通常命名为pop(),获取队首元素:front(),获取队尾元素:back(),判断队空:empty(),返回队列个数:size()

q.push()                入队:在队尾压入新元素
q.pop()                 出队:删除队列首元素但不返回其值
q.front()               返回队首元素的值,但不删除该元素
q.back()                返回队列尾元素的值,但不删除该元素
q.empty()               如果队列为空返回true,否则返回false
q.size()                返回队列中元素的个数

四、代码实操

#include<iostream>
#include<queue>
using namespace std;
int main()
{
	queue<int> q; //定义一个数据类型为int的queue 
	q.push(1); //向队列中加入元素1 
	q.push(2); //向队列中加入元素2
	q.push(3); //向队列中加入元素3 
	q.push(4); //向队列中加入元素4 
	cout<<"将元素1、2、3、4一一加入队列中后,队列中现在的元素为:1、2、3、4"<<endl;
	cout<<"队列中的元素个数为:"<<q.size()<<endl;
	//判断队列是否为空 
	if(q.empty())
	{
		cout<<"队列为空"<<endl;
	}
	else
	{
		cout<<"队列不为空"<<endl;
	}
	cout<<"队列的队首元素为:"<<q.front()<<endl;
	//队列中的队首元素出队 
	q.pop();
	cout<<"将队列队首元素出队后,现在队列中的元素为2、3、4"<<endl;		
}

运行结果:

将元素1、2、3、4一一加入队列中后,队列中现在的元素为:1、2、3、4
队列中的元素个数为:4
队列不为空
队列的队首元素为:1
将队列队首元素出队后,现在队列中的元素为2、3、4

五、队列遍历

列中的数据和堆栈一样是不允许随机访问的,即不能通过下标访问,且队列内的元素也是无法遍历的。

我们可以通过while循环的方法将queue中的元素读取一遍,但是这种方法非常局限,因为我们每读取一个元素就需要将这个元素出队,因此该方法只能读取一遍queue中的元素。

#include<iostream>
#include<queue>
using namespace std;
int main()
{
	queue<int> q; //定义一个数据类型为int的queue
	q.push(1); //向队列中加入元素1 
	q.push(2); //向队列中加入元素2
	q.push(3); //向队列中加入元素3
	q.push(4); //向队列中加入元素4
	while(!q.empty())
	{
		cout<<q.front()<<" ";
		q.pop();
	}	
}

六、案例实操

插松枝:

题目描述:

人造松枝加工场的工人需要将各种尺寸的塑料松针插到松枝干上,做成大大小小的松枝。他们的工作流程(并不)是这样的:

  • 每人手边有一只小盒子,初始状态为空。
  • 每人面前有用不完的松枝干和一个推送器,每次推送一片随机型号的松针片。
  • 工人首先捡起一根空的松枝干,从小盒子里摸出最上面的一片松针 —— 如果小盒子是空的,就从推送器上取一片松针。将这片松针插到枝干的最下面。
  • 工人在插后面的松针时,需要保证,每一步插到一根非空松枝干上的松针片,不能比前一步插上的松针片大。如果小盒子中最上面的松针满足要求,就取之插好;否则去推送器上取一片。如果推送器上拿到的仍然不满足要求,就把拿到的这片堆放到小盒子里,继续去推送器上取下一片。注意这里假设小盒子里的松针片是按放入的顺序堆叠起来的,工人每次只能取出最上面(即最后放入)的一片。
  • 当下列三种情况之一发生时,工人会结束手里的松枝制作,开始做下一个:

(1)小盒子已经满了,但推送器上取到的松针仍然不满足要求。此时将手中的松枝放到成品篮里,推送器上取到的松针压回推送器,开始下一根松枝的制作。

(2)小盒子中最上面的松针不满足要求,但推送器上已经没有松针了。此时将手中的松枝放到成品篮里,开始下一根松枝的制作。

(3)手中的松枝干上已经插满了松针,将之放到成品篮里,开始下一根松枝的制作。

现在给定推送器上顺序传过来的 N 片松针的大小,以及小盒子和松枝的容量,请你编写程序自动列出每根成品松枝的信息。

输入格式:

输入在第一行中给出 3 个正整数:N(≤103),为推送器上松针片的数量;M(≤20)为小盒子能存放的松针片的最大数量;K(≤5)为一根松枝干上能插的松针片的最大数量。

随后一行给出 N 个不超过 100 的正整数,为推送器上顺序推出的松针片的大小。

输出格式:

每支松枝成品的信息占一行,顺序给出自底向上每片松针的大小。数字间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:

8 3 4
20 25 15 18 20 18 8 5

输出样例:

20 15
20 18 18 8
25 5

详细代码: 

#include<bits/stdc++.h>
using namespace std;
stack<int>box;
queue<int>p,t;
int main()
{
	int n,m,k;
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++)
	{
		int a;
		cin>>a;
		p.push(a);
	}
	while(p.size()||box.size())
	{
		t.push(101);
		while(t.size()<=k)
		{
			if(box.size()&&box.top()<=t.back())
			{
				t.push(box.top());
				box.pop();
			}
			else if(p.size()&&p.front()<=t.back())
			{
				t.push(p.front());
				p.pop();
			}
			else if(p.size()&&box.size()<m)
			{
				box.push(p.front());
				p.pop();
			}
			else 
				break;
		}
		t.pop();
		cout<<t.front();
		t.pop();
		while(t.size())
		{
			cout<<" "<<t.front();
			t.pop();
			
		}
		cout<<endl;
	}
}

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

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

相关文章

了解负载均衡器

现代系统变得越来越复杂&#xff0c;但这种复杂性确保了处理大量的网络流量和请求。 简单来说&#xff0c;负载均衡器的主要思想就像它的名字一样&#xff0c;它跨服务器提供直接的客户端请求。换句话说&#xff0c;负载均衡器是在多台服务器之间分配网络或应用程序流量的系统…

【系统架构设计师】六、信息系统基础知识(定义|分类|企业信息化系统|生命周期|建设原则|开发方法)

目录 一、信息系统的定义 二、信息系统的分类 三、企业使用的信息化系统 四、信息系统的生命周期 五、信息系统建设原则 六、信息系统的开发方法 6.1 结构化方法 6.2 原型法 6.3 构件化开发方法 6.4 面向服务的方法 6.5 面向对象的方法 6.6 敏捷方法 历年真题考情&#x…

AMSR-E/Aqua L1A 原始观测次数,第 3 版

AMSR-E/Aqua L1A Raw Observation Counts, Version 3 简介 改进后的 V003 AMSREL1A 产品对共同登记参数 A1 和 A2 进行了经验修正&#xff0c;并更新了用于修正 AMSR-E 89 GHz 位置信息的参数文件。因此&#xff0c;第三版 AMSREL1A 数据提高了以下方面的精度&#xff1a;纬度…

【个人博客搭建】(26)发布后端webapi项目

1、选择启动的webapi&#xff0c;右击发布 2、选择左下角的“显示所有设置” 在上一页按钮那边是发布文件夹的目录 地址&#xff0c; 现在界面的就是配置的信息&#xff0c; 配置&#xff1a;Debug、Release 目标框架&#xff1a;我们用的net8.0&#xff0c;就是他&#xff…

Golang | Leetcode Golang题解之第191题位1的个数

题目&#xff1a; 题解&#xff1a; func hammingWeight(num uint32) (ones int) {for ; num > 0; num & num - 1 {ones}return }

C语言 | Leetcode C语言题解之第191题位1的个数

题目&#xff1a; 题解&#xff1a; int hammingWeight(uint32_t n) {int ret 0;while (n) {n & n - 1;ret;}return ret; }

S_LOVE多端恋爱小站小程序源码 uniapp多端

S_LOVE多端恋爱小站小程序源码&#xff0c;采用uniapp多端开发框架进行开发&#xff0c;目前已适配H5、微信小程序版本。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89421726 更多资源下载&#xff1a;关注我。

数据库系统体系结构-DBMS的三级模式结构、DBMS的工作方式、模式定义语言、二级映射

一、体系结构的概念 1、大多数DBMS遵循三级模式结构 &#xff08;1&#xff09;外模式 &#xff08;2&#xff09;概念模式 &#xff08;3&#xff09;内模式 2、DBMS的体系结构描述的应该是系统的组成结构及其联系以及系统结构的设计和变化的原则等 3、1978年美国国家标…

在flask中加载mnist模型,并预测图片

一、在tensorflow中新建及保存模型 启动Jupyter Notebook 新建Notebook 生成 mnist_model.h5 模型的代码 import tensorflow as tf from tensorflow.keras.datasets import mnist from tensorflow.keras.models import Sequential from tensorflow.keras.layers import…

【Oracle篇】逻辑备份工具expdp(exp)/impdp(imp)和物理备份工具rman的区别和各自的使用场景总汇(第八篇,总共八篇)

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux&#xff0c;也在扩展大数据方向的知识面✌️…

26.4 Django 视图层

1. 视图函数 视图函数是Django框架中用于处理Web请求并返回Web响应的重要组件. 以下是对Django视图函数的详细解释: * 1. 视图函数与URL的映射.为了让Django能够知道哪个URL对应哪个视图函数, 需要在应用的urls.py文件中定义URL模式.使用path或re_path函数来定义URL模式, 并将…

计算机视觉的职业规划

Hi&#xff0c;大家好。我是茶桁。 今天这节课呢&#xff0c;咱们先不着急讲原理&#xff0c;先来讲讲职业规划的话题。 如果想要直接上手企业级的 AI 项目&#xff0c;可以看看咱们的「AI 人工智能企业项目实战」。 趋势和薪资 首先&#xff0c;先来讲讲就业的趋势。其实学…

Python学习笔记20:进阶篇(九)常见标准库使用之sys模块和re模块

前言 本文是根据python官方教程中标准库模块的介绍&#xff0c;自己查询资料并整理&#xff0c;编写代码示例做出的学习笔记。 根据模块知识&#xff0c;一次讲解单个或者多个模块的内容。 教程链接&#xff1a;https://docs.python.org/zh-cn/3/tutorial/index.html 错误输出…

python笔记3

1.通过乘法多次打印&#xff0c;以及字符串相加的合体打印 xzzz yyyy print(xy) print(x*10)#与一个数为打印多少次 2.设置俩个变量&#xff0c;可以通过下面的方法来判断是否一个元素是否在另一个元素中&#xff0c;返回bool值 xzzz yyyy print(xy) print(x*10)#与一个数为打…

算法学习笔记——单双链表及其反转—堆栈诠释

单双链表及其反转——堆栈诠释 按值传递 int、long、byte、short、char、float、double、boolean和String 都是按值传递 概念&#xff1a;在方法被调用时&#xff0c;实参通过形参把它的内容副本传入方法内部&#xff0c;此时形参接收到的内容是实参值的一个拷贝&#xff0c;…

Windows 获取打印机及端口号方法 (C#)

1. 打开注册表编辑器 regedit 2.选择如下配置 计算机\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Device 3. 代码 C# using System; using Microsoft.Win32;class Program {static void Main(){string registryPath "SOFTWARE\Microsoft\Windows …

解决pycharm安装dlib失败的问题

今天使用pycharm来学习opencv人脸识别库face-recognition的时候出现了一点小问题&#xff0c;在pycharm中直接安装face-recognition会失败&#xff0c;说是因为缺少依赖库dlib&#xff0c;但是直接使用pycharm安装dlib库也有问题&#xff0c;不知道大家遇到没有 错误提示 note…

【unity实战】Unity中基于瓦片的网格库存系统——类似《逃离塔科夫》的库存系统

最终效果 文章目录 最终效果前言素材下载图片配置获取格子坐标动态控制背包大小添加物品移动物品物品跟随鼠标创建物品的容器&#xff0c;定义不同物品修改物品尺寸修复物品放置位置问题按物品尺寸占用对应大小的格子判断物品是否超出边界范围物品放置重叠&#xff0c;交换物品…

全景图片/老照片/动漫图片一键无损放大与修复

在日常生活中&#xff0c;我们经常使用系统自带的图片处理软件来对图片进行缩放操作&#xff0c;从而实现放大或缩小图片。然而&#xff0c;这种方法会带来一个问题&#xff1a;如果原始图片较小&#xff0c;放大后会导致精度损失&#xff0c;使图片变得模糊。 近年来&#xf…

SD-WAN带宽对使用的影响及如何规划

SD-WAN&#xff08;软件定义广域网&#xff09;是一种创新技术&#xff0c;旨在优化和提升企业网络的性能、可靠性和安全性。带宽在SD-WAN的使用中起着关键作用&#xff0c;而确定SD-WAN专线所需的带宽大小需要综合考虑多个因素。本文将深入探讨SD-WAN带宽对使用的影响以及如何…