【算法通关指南:数据结构和算法篇】算法里的 “排队系统”:队列的数组模拟 + STL queue 实战

【算法通关指南:数据结构和算法篇】算法里的 “排队系统”:队列的数组模拟 + STL queue 实战
在这里插入图片描述
🔥小龙报:个人主页
🎬作者简介:C++研发,嵌入式,机器人方向学习者
❄️个人专栏:《算法通关指南》
永远相信美好的事情即将发生
在这里插入图片描述

文章目录


前言

本专栏聚焦算法题实战,系统讲解算法模块:以《c++编程》,《数据结构和算法》《基础算法》《算法实战》 等几个板块以题带点,讲解思路与代码实现,帮助大家快速提升代码能力
ps:本章节题目分两部分,比较基础笔者只附上代码供大家参考,其他的笔者会附上自己的思考和讲解,希望和大家一起努力见证自己的算法成长

一、队列的概念

队列也是⼀种访问受限的线性表,它只允许在表的⼀端进行插入操作,在另⼀端进行删除操作。
• 允许插入的⼀端称为队尾,允许删除的⼀端称为队头。
• 先进入队列的元素会先出队,故队列具有先进先出(FirstInFirstOut)的特性。

二、队列的模拟实现

2.1创建

• 一个足够大的数组充当队列;
• 一个变量h 标记队头元素的前⼀个位置
• 一个变量t标记队尾元素的位置。两个变量(h, t] 是⼀种左开右闭的形式,这样设定纯属个人喜好,因为后续的代码写着比较舒服。,也以h标记队头元素的位置。只要能控制住代码不出现bug ,想怎么实现就怎么实现。

在这里插入图片描述
constint N =1e6+10;int h, t;// 队头指针,队尾指针int q[N];// 队列

2.2 入队

注意:我们依旧从下标为1的位置开始存储有效元素

在这里插入图片描述
// ⼊队voidpush(int x){ q[++t]= x;}

时间复杂度:O(1)

2.3出队

在这里插入图片描述
// 出队voidpop(){ h++;;}

时间复杂度:O(1)

2.4队头

注意:不是h所指的位置,而是h所指的下⼀个位置

在这里插入图片描述
// 队头元素intfront(){return q[h +1];}

时间复杂度:O(1)

2.5队尾

在这里插入图片描述
// 队尾元素intback(){return q[t];}

时间复杂度:O(1)

2.6判空

在这里插入图片描述
// 队列是否为空 bool empty(){return t == h;}

时间复杂度:O(1)

2.7有效元素个数

在这里插入图片描述
// 队列的大小intsize(){return t - h;}

时间复杂度:O(1)

2.8 所有测试代码

#include<iostream> using namespace std;constint N =1e6+10;int h, t;// 队头指针,队尾指针int q[N];// 队列// ⼊队voidpush(int x){ q[++t]= x;}// 出队voidpop(){ h++;;}// 队头元素intfront(){return q[h +1];}// 队尾元素intback(){return q[t];}// 队列是否为空 bool empty(){return t == h;}// 队列的大小intsize(){return t - h;}intmain(){// 测试for(int i =1; i <=10; i++){push(i);}while(size())// while(!empty()){ cout <<front()<<" "<<back()<< endl;pop();}return0;}

运行结果:

在这里插入图片描述

三、queue

(1)如何创建?
(2)里面提供了什么函数接口?
(3) 每个函数的功能以及时间复杂度

3.1 如何创建

queue<T> q; T :可以是任意类型的数据。 

3.2容器相关接口

3.2.1 size / empty

(1) size :返回队列⾥实际元素的个数;
(2) empty :返回队列是否为空。

时间复杂度:O(1)

3.2.2 push / pop

(1) push :入队;
(2)pop:出队。

时间复杂度:O(1)

3.2.3 front / back

(1) front :返回队头元素,但不会删除
(2) b ack :返回队尾元素,但不会删除
时间复杂度: O(1)

3.3测试所有接口

#include<iostream>#include<queue> using namespace std;typedef pair<int,int> PII;intmain(){// 测试queue queue<PII> q;for(int i =1; i <=10; i++){ q.push({ i, i *10});}while(q.size())// while(!q.empty()){auto t = q.front(); q.pop(); cout << t.first <<" "<< t.second << endl;}return0;}

运行结果:

在这里插入图片描述

总结与每日励志时刻

本文介绍了队列的概念、实现方法和STL中的queue容器。队列是一种先进先出(FIFO)的线性数据结构,文章详细讲解了如何用数组模拟实现队列,包括入队、出队、获取队头/队尾元素、判空和计算元素个数等操作。同时,文章也介绍了C++标准库queue容器的基本用法和接口函数。队列在算法竞赛中应用广泛,主要关注时间效率,通常采用数组实现。文章还提供了完整的测试代码和运行结果,帮助读者理解队列的实现原理和使用方法。

在这里插入图片描述

Read more

C++ 多线程同步之原子操作(atomic)实战

C++ 多线程同步之原子操作(atomic)实战

C++ 多线程同步之原子操作(atomic)实战 💡 学习目标:掌握 C++ 标准库中原子操作的使用方法,理解原子操作与互斥锁的区别,能够在轻量级同步场景中高效解决数据竞争问题。 💡 学习重点:std::atomic 模板的常用接口、原子操作的特性、原子类型与普通类型的性能对比、原子操作的典型应用场景。 50.1 原子操作的引入背景 在 48 章我们学习了互斥锁,它通过阻塞线程的方式实现临界区保护。 但互斥锁存在上下文切换开销,在一些简单的同步场景中显得过于笨重。 比如对单个变量的自增、自减、赋值等操作,我们需要一种更轻量级的同步方案——原子操作。 ⚠️ 注意事项:原子操作仅适用于单个变量的简单同步,无法替代互斥锁实现复杂临界区的保护。 举个例子,使用互斥锁保护变量自增: #include<iostream>#include<thread>#include<mutex>usingnamespace std;

Re:从零开始的 C++ 进阶篇(三)彻底搞懂 C++ 多态:虚函数、虚表与动态绑定的底层原理

Re:从零开始的 C++ 进阶篇(三)彻底搞懂 C++ 多态:虚函数、虚表与动态绑定的底层原理

◆ 博主名称: 晓此方-ZEEKLOG博客大家好,欢迎来到晓此方的博客。⭐️C++系列个人专栏: 主题曲:C++程序设计⭐️ 踏破千山志未空,拨开云雾见晴虹。 人生何必叹萧瑟,心在凌霄第一峰 0.1概要&序論 这里是此方,好久不见。 多态是 C++ 中最核心而且是最难理解的机制之一。它不仅是语法层面的特性,更牵涉到 C++ 的对象模型、对象内存布局以及多态机制的底层实现原理。本文将从底层原理出发,系统全面解析多态的真实运作机制。这里是「此方」。让我们现在开始吧! 一,多态的概念 通俗来说,多态就是多种形态。多态分为编译时多态(静态多态) 和 运行时多态(动态多态),这里我们重点讲运行时多态。 1.1编译时多态(静态多态) 编译时多态主要就是我们前面讲的 函数重载和函数模板。 它们通过传递不同类型的参数就可以调用不同的函数,通过参数不同达到多种形态。之所以叫编译时多态,是因为实参传递给形参的参数匹配是在编译时完成的,

【算法通关指南:数据结构和算法篇】别再用指针写链表了!数组模拟单 / 双向链表,C++ 实战超丝滑

【算法通关指南:数据结构和算法篇】别再用指针写链表了!数组模拟单 / 双向链表,C++ 实战超丝滑

🔥小龙报:个人主页 🎬作者简介:C++研发,嵌入式,机器人方向学习者 ❄️个人专栏:《算法通关指南》 ✨ 永远相信美好的事情即将发生 文章目录 * 前言 * 一、链表的概念 * 1.1 链表的定义 * 1.2 链表的分类 * 二、链表的模拟实现 * 2.1 单链表的模拟实现 * 2.1.1 定义-创建-初始化 * 2.1.2 头插 * 2.1.3 遍历链表 * 2.1.4 按值查找 * 策略一:遍历整个链表 * 策略二:使用哈希表优化 * 2.1.5 在任意位置之后插入元素 * 2.

大厂Java最详细面试题(2025版全网最全)

大厂Java最详细面试题(2025版全网最全)

1、线程池的核心参数和执行原理? 线程池的核心参数有七个: corePoolSize:核心线程数 maximumPoolSize:最大线程数量,核心线程+救急线程的最大数量 keepAliveTime:救急线程的存活时间,存活时间内没有新任务,该线程资源会释放 unit:救济线程的存活时间的单位 workQueue:工作队列,当没有空闲核心线程时,新来的任务会在此队列排队,当该队列已满时,会创建应急线程来处理该队列的任务 treadFactory:线程工厂,可以定制线程的创建,线程名称,是否是[守护线程] handler:拒绝策略,在线程数量达到最大线程数量时,实行拒绝策略 拒绝策略: 线程池执行原理: 2、线程池常见的[阻塞队列]? 常见的阻塞队列有: ArrayBlockingQueue:基于数组结构的有界阻塞队列,FIFO LinkedBlockingQueue:基于链表的有界阻塞队列,FIFO 两者区别(链表与数组的区别) ArrayBlockingQueueLinkedBlockingQueue底层是数组底层是链表强制有界默认无界,传递容量参数后