备战蓝桥杯 队列和queue详解

news2025/1/15 23:44:15

目录

队列的概念

队列的静态实现

总代码

stl的queue

队列算法题

1.队列模板题

2.机器翻译

3.海港

双端队列


队列的概念

和栈一样,队列也是一种访问受限的线性表,它只能在表头位置删除,在表尾位置插入,队列是先进先出(FIFO)栈是后进先出(LIFO)

队列的静态实现

我们用一个比较大的数组来表示队列,h表示队头的前一个元素,t表示队尾元素

队列的创建

#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int q[N], h, t;

队列的插入

void push(int x)
{
	q[++t] = x;
}

和顺序表的尾插差不多,时间复杂度是O(1)

队列的删除

我们的删除直接让头指针向前移动一位就行了

void pop()
{
	h++;
}

查询队头元素

h指向的是队头的前一个元素的下标,所以h+1是队头的下标

int front()
{
	return q[h + 1];
}

查询队尾元素

t就是队尾元素的下标

int back()
{
	return q[t];
}

队列判空

当我们只剩一个元素的时候,h指向这个元素的前面,t指向这个元素,如果删除的话,h++ h就和t相等了,这和我们刚开始没有元素的状态也是一致的,所以h==t就是我们判断队列为空的要点

bool empty()
{
	return h == t;
}

队列有效元素个数

由于我们h和t是左开右闭的,所以t-h就是中间的元素个数,比如h指向1,t指向3的时候,下标2,3就是我们的元素,3-1=2就是元素个数是一致的

int size()
{
	return t - h;
}

测试

总代码

#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int q[N], h, t;
void push(int x)
{
	q[++t] = x;
}
void pop()
{
	h++;
}
int front()
{
	return q[h + 1];
}
int back()
{
	return q[t];
}
bool empty()
{
	return h == t;
}
int size()
{
	return t - h;
}
int main()
{
	for (int i = 1; i <= 10; i++)
	{
		push(i);
	}
	while (size())
	{
		cout << front() << " " << back() << endl;
		pop();
	}

	return 0;
}

stl的queue

测试代码

#include <iostream>
#include <queue>
using namespace std;
typedef pair<int, int> PII;
int main()
{

	queue <PII> q;
	for (int i = 1; i <= 10; i++)
	{
		q.push({ i,i * 10 });
	}
	while (!q.empty())
	{
		auto t = q.front();
		int first = t.first;
		int second = t.second;
		cout << first << " " << second << endl;
		q.pop();
	}

}

测试结果

队列算法题

1.队列模板题

#include <iostream>
using namespace std;
const int N = 1e4+10;
int q[N],h,t;

int main()
{
	int n,op,x;
	cin >> n;
	while(n--)
	{
		cin >> op;
		if(op == 1)
		{
			cin >> x;
			q[++t] = x;
		}
		else if(op == 2)
		{
			if(t-h == 0) cout << "ERR_CANNOT_POP" << endl;
			else h++;
		}
		else if(op == 3)
		{
			if(t-h == 0) cout << "ERR_CANNOT_QUERY" << endl;
			else cout << q[h+1] << endl;
		}
		else
		{
			cout << t-h << endl;
		}
	}
}

2.机器翻译

我们可以用队列来模拟这个内存存储的单元格,此外我们还需要一个bool数组来判断某个单词在不在内存中

下面是我们的实现的代码

#include <iostream>
#include <queue>
using namespace std;
const int N = 1010;
bool st[N];
int cnt;
queue <int> q;
int main()
{
	int n,m;
	cin >> m >> n;
	while(n--)
	{
		int x; cin >> x;
		if(st[x]);
		else{
			q.push(x);
			st[x] = true;
			cnt++;
			if(q.size() > m)
			{
				st[q.front()] = false;
				q.pop();
			}
		}
		
		
	}
	cout << cnt << endl;
}

3.海港

这道题我们用队列来模拟,我们用一个数组来记录每个国家的人数,当每个国家从0变1时,种类加1,从1变0时,种类减1

先把每个船的信息入队列,用pair类型,<时间,国家>来入队列,每次入队列判断种类是否加1

每个船的信息入完了之后,要判断队列合不合法,如果队头的时刻和队尾的时刻差值超过24小时,我们就要把第一个时刻的信息出队列,出队列的时候再次判断要不要让种类减1

每次一个信息弄完就打印一下种类

#include <iostream>
#include <queue>
using namespace std;
const int N = 1e5+10;
typedef pair<int,int> PII;
int t,k;
int cnt[N];//记录每个国家的人数,从0到1时种类加1,从1到0时种类减1,其他不变 
int kinds;//记录国家种类 
queue <PII> q;
int main()
{
    int n;
	cin >> n;
	while(n--)
	{
		cin >> t >> k;
		while(k--)
		{
			int x;
			cin >> x;
			q.push({t,x});
			if(cnt[x]++ == 0)
			{
				kinds++;
			}
		}
	    //让队列合法
		while(q.size() && (q.back().first - q.front().first >= 86400)) 
		{
			int tmp;
			tmp = q.front().second;
			if(cnt[tmp]-- == 1)
			{
				kinds--;
			}
			q.pop();
		}
			cout << kinds << endl;
	}	

	
	return 0;
 } 

双端队列

什么是双端队列?

双端队列也是一种特殊的线性表,它允许在表的两端插入和删除元素

我们就不实现它的模拟实现了

我们直接用stl现成的双端队列deque测试一下

头插头删

#include <iostream>
#include <deque>
using namespace std;
struct node {
	int x, y, z;
};
deque <node> q;
int main()
{
	//头插和头删
	for (int i = 1; i <= 5; i++)
	{
		q.push_front({ i,i * 5,i * 10 });
	}
	while (q.size())
	{
		auto t = q.front();
		q.pop_front();
		cout << t.x << " " << t.y << " " << t.z << endl;
	}
}

同理尾插和尾删

#include <iostream>
#include <deque>
using namespace std;
struct node {
	int x, y, z;
};
deque <node> q;
int main()
{
	//尾插和尾删
	for (int i = 1; i <= 5; i++)
	{
		q.push_back({ i,i * 5,i * 10 });
	}
	while (q.size())
	{
		auto t = q.back();
		q.pop_back();
		cout << t.x << " " << t.y << " " << t.z << endl;
	}
}

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

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

相关文章

工厂物流管理系统方案(二):危险品车辆专用导航系统架构设计深度剖析

本文专为IT架构师、物流技术专家、软件开发工程师及对危险品运输导航技术有深入探索需求的读者撰写&#xff0c;旨在全面解析危险品车辆专用导航系统的架构设计&#xff0c;展现其技术深度与复杂性&#xff0c;为行业同仁提供权威的技术参考与实践指导。如需获取危险品车辆专用…

用 Python 从零开始创建神经网络(十九):真实数据集

真实数据集 引言数据准备数据加载数据预处理数据洗牌批次&#xff08;Batches&#xff09;训练&#xff08;Training&#xff09;到目前为止的全部代码&#xff1a; 引言 在实践中&#xff0c;深度学习通常涉及庞大的数据集&#xff08;通常以TB甚至更多为单位&#xff09;&am…

No.1|Godot|俄罗斯方块复刻|棋盘和初始方块的设置

删掉基础图标新建assets、scenes、scripts文件夹 俄罗斯方块的每种方块都是由四个小方块组成的&#xff0c;很适合放在网格地图中 比如网格地图是宽10列&#xff0c;高20行 要实现网格的对齐和下落 Node2D节点 新建一个Node2D 添加2个TileMapLayer 一个命名为Board&…

蓝桥云客第 5 场 算法季度赛

题目&#xff1a; 2.开赛主题曲【算法赛】 - 蓝桥云课 问题描述 蓝桥杯组委会创作了一首气势磅礴的开赛主题曲&#xff0c;其歌词可用一个仅包含小写字母的字符串 S 表示。S 中的每个字符对应一个音高&#xff0c;音高由字母表顺序决定&#xff1a;a1,b2,...,z26。字母越靠后…

刀客doc:快手的商业化架构为什么又调了?

一、 1月10日&#xff0c;快手商业化及电商事业部进行新一轮的架构调整。作为2025年快手的第一次大调整&#xff0c;变动最大的是负责广告业务的商业化事业部。快手商业化将原来的8个业务中心&#xff0c;现在统合成了5个&#xff0c;行业归拢看上去更加明晰了。 根据自媒体《…

6.2 MySQL时间和日期函数

以前我们就用过now()函数来获得系统时间&#xff0c;用datediff()函数来计算日期相差的天数。我们在计算工龄的时候&#xff0c;让两个日期相减。那么其中的这个now函数返回的就是当前的系统日期和时间。 1. 获取系统时间函数 now()函数&#xff0c;返回的这个日期和时间的格…

mock服务-通过json定义接口自动实现mock服务

go-mock介绍 不管在前端还是后端开发过程中&#xff0c;当我们需要联调其他服务的接口&#xff0c;而这个服务还没法提供调用时&#xff0c;那我们就要用到mock服务&#xff0c;自己按接口文档定义一个临时接口返回指定数据&#xff0c;以供本地开发联调测试。 怎么快速启动一…

sparkSQL练习

1.前期准备 &#xff08;1&#xff09;建议先把这两篇文章都看一下吧&#xff0c;然后把这个项目也搞下来 &#xff08;2&#xff09;看看这个任务 &#xff08;3&#xff09;score.txt student_id,course_code,score 108,3-105,99 105,3-105,88 107,3-105,77 105,3-245,87 1…

CSS | 实现三列布局(两边边定宽 中间自适应,自适应成比)

目录 示例1 &#xff08;中间自适应 示例2&#xff08;中间自适应 示例3&#xff08;中间自适应 示例4 &#xff08;自适应成比 示例5&#xff08;左中定宽&#xff0c;右边自适应 示例6&#xff08;中间自适应 示例7&#xff08;中间自适应 示例8&#xff08;中间定宽…

力扣 子集

回溯基础&#xff0c;一题多解&#xff0c;不同的回朔过程。 题目 求子集中&#xff0c;数组的每种元素有选与不选两种状态。因此在使用dfs与回溯时把每一个元素分别进行选与不选的情况考虑即可。可以先用dfs跳过当前元素即不选然后一直深层挖下去&#xff0c;直到挖到最深了即…

网络层协议-----IP协议

目录 1.认识IP地址 2.IP地址的分类 3.子网划分 4.公网IP和私网IP 5.IP协议 6.如何解决IP地址不够用 1.认识IP地址 IP 地址&#xff08;Internet Protocol Address&#xff09;是指互联网协议地址。 它是分配给连接到互联网的设备&#xff08;如计算机、服务器、智能手机…

RocketMQ 知识速览

文章目录 一、消息队列对比二、RocketMQ 基础1. 消息模型2. 技术架构3. 消息类型4. 消费者类型5. 消费者分组和生产者分组 三、RocketMQ 高级1. 如何解决顺序消费和重复消费2. 如何实现分布式事务3. 如何解决消息堆积问题4. 如何保证高性能读写5. 刷盘机制 &#xff08;topic 模…

C++(类和对象)

C中的类 C中兼容对C语言中struct的所有用法.同时C对struct进行了语法的升级.将struct升级成了类. // c中对于struct的改进: struct Stack {int* a;int top;int capacity; } int main() { Stack s;// 这里可以直接使用Stack进行使用,而不再需要struct关键字了return 0; }注意:…

centos 8 中安装Docker

注&#xff1a;本次样式安装使用的是centos8 操作系统。 1、镜像下载 具体的镜像下载地址各位可以去官网下载&#xff0c;选择适合你们的下载即可&#xff01; 1、CentOS官方下载地址&#xff1a;https://vault.centos.org/ 2、阿里云开源镜像站下载&#xff1a;centos安装包…

Sui Move:基本概览一

Module (模块) Move 代码被组织成模块, 可以把一个模块看成是区块链上的一个智能合约 可以通过调用这些模块中的函数来与模块进行交互&#xff0c;可以通过事务或其他 Move 代码来实现, 事务将被发送到并由Sui区块链进行处理&#xff0c;一旦执行完成&#xff0c;结果的更改将…

1/13+2

运算符重载 myString.h #ifndef MYSTRING_H #define MYSTRING_H #include <cstring> #include <iostream> using namespace std; class myString {private:char *str; //记录c风格的字符串int size; //记录字符串的实际长度int capacity; …

GD32F470Z外部晶振不起振

亲测&#xff0c;主要的原因是因为系统配置里面选择的晶振&#xff0c;选择内部还是外部的无源晶振。 1.无源晶振 打开startup_gd32f450_470.s这个起始文件。 ​​​​​​​ ​​​​​​​ 找到SystemInit。 跳进去这个函数。 在这个函数里面最底下找到sys…

用css和html制作太极图

目录 css相关参数介绍 边距 边框 伪元素选择器 太极图案例实现、 代码 效果 css相关参数介绍 边距 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>*{margin: 0;padding: 0;}div{width: …

【2025 Rust学习 --- 17 文本和格式化 】

字符串与文本 Rust 的主要文本类型 String、str 和 char 内容概括&#xff1a; Unicode 背景知识&#xff1f;单个 Unicode 码点的 char&#xff1f;String 类型和 str 类型都是表示拥有和借用的 Unicode 字符序列。Rust 的字符串格式化工具&#xff0c;比如 println! 宏和 …

C#中颜色的秘密

颜色的秘密: 颜色Color是一个调色板, 所有颜色都是由透明度Alpha,红Red,绿Green,蓝Blue按不同比例调色混合而成,如果不考虑透明度Alpha,颜色共有256*256*25616777216种 ColorARGB A,R,G,B都为byte型[8位],因此可以用整体的32个整数[Int32]来表示一种颜色 Color 所属命名空…