《C++ 栈和队列详解》

article/2025/6/6 3:51:20

目录

栈和队列的实现

优先级队列的实现

仿函数


栈和队列的实现

在C++的STL中栈和队列是两种容器适配器。容器适配器是通过封装其他容器的接口来实现的一种特殊容器。

Stack的底层可以是deque,也可以是list和vector。queue的底层可以是deque,也可以是list(vector头删效率低)。不同的底层容器需要传递不同的模板参数来实现。

所有的操作都是复用的其他容器的操作,但是他们内部不提供迭代器,如果要遍历内部元素取栈顶/取对头,再删除即可。

#pragma once
#include<deque>
namespace lzk
{	 //在测试文件中打开了sdt且包含了头文件//就不用在deque前面标明stdtemplate<class T, class Container = std:: deque<T>>class stack{public:void push_back(const T& x){_con.push_back(x);}void pop(){_con.pop_back();}T& top(){return _con.back();}const T& top() const{return _con.back();}bool empty() const{return _con.empty();}size_t size() const{return _con.size();}private:Container _con;};
}
#pragma once
#include<deque>
namespace lzk
{template< class T, class Container = deque<T>>class queue{public:void push_back(const T& x){_con.push_back(x);}void pop(){_con.pop_front();}T& front(){return _con.front();}const T& fonst() const{return _con.front();}T& back(){return _con.back();}const T& back() const{return _con.back();}bool empty() const{return _con.empty();}size_t size() const{return _con.size();}private:Container _con;};
}

优先级队列的实现

优先级队列的底层是vector,vector中的元素是按堆(默认是大堆)的结构来排列的。如果要排列不同的堆结构需要显示传递模板参数。

实现优先级队列需要复用vector中的接口,需要了解堆的调整算法,在插入时,向上调整;在删除时,向下调整,还需要实现仿函数。

仿函数

仿函数是C++中一种行为类似函数的对象,它通过重载函数调用运算符operator()来实现。仿函数比普通函数更灵活,可以拥有状态,并且可以作为模板参数传递。在比较需求不同时,可以通过传递不同的函数对象来满足需求。

//仿函数template<class T>class less{public://重载()bool operator()(const T &x, const T& y){return x < y;}};template<class T>class less<T*>{public://重载()bool operator()(const T* const &x, const T* const & y){return x < y;}};//使用不同类别的仿函数可以按需求来比较数据template<class T>class greater{public:bool operator()(const T& x, const T& y){return x > y;}};template<class T>class greater<T*>{public:bool operator()(const T* const & x, const T*const & y){return *x > *y;}};
template<class T, class Container = std::vector<T>, class compare = less<T>>class priority_queue{public:void push(const T& x){_con.push_back(x);//AdjustUp();AdjustUp(_con.size() - 1); }void AdjustUp(int child){//compare是一个类型,可以实例化对象compare com;int parent = (child - 1) / 2;while (parent >= 0){//if (_con[child] > _con[parent])//利用仿函数//if(com(&_con[parent] , &_con[child]))if(com(_con[parent] , _con[child])){std::swap(_con[child], _con[parent]);child = parent;parent = (parent - 1) / 2;}else {break;}}}void pop(){std::swap(_con[0], _con[_con.size() - 1]);_con.pop_back();//AdjustDown();AdjustDown(0);//adjustdown(0);}void AdjustDown(size_t parent){	compare com;size_t child = parent * 2 + 1;while (child < _con.size()){//if (child + 1 < _con.size() && _con[child] < _con[child + 1] )//if (child + 1 < _con.size() &&  com(&_con[child] , &_con[child + 1]))if (child + 1 < _con.size() &&  com(_con[child] , _con[child + 1])){child++;}//if (com(&_con[parent] , &_con[child]))if (com(_con[parent] , _con[child])){std::swap(_con[child], _con[parent]);parent = child;child = child * 2 + 1;}else {break;}					}}		 //取堆顶数据const T& top() const{return _con[0];}bool empty(){return _con.empty();}size_t size(){return _con.size();}private:Container _con;};
}

"🚀 保持热爱,继续 Coding!" 


http://www.hkcw.cn/article/MlbTjrGhfZ.shtml

相关文章

OpenCV CUDA模块图像处理------图像融合函数blendLinear()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数执行 线性融合&#xff08;加权平均&#xff09; 两个图像 img1 和 img2&#xff0c;使用对应的权重图 weights1 和 weights2。 融合公式…

“packageManager“: “pnpm@9.6.0“ 配置如何正确启动项目?

今天在学习开源项目的时候&#xff0c;在安装依赖时遇到了一个报错 yarn add pnpm9.6.0 error This projects package.json defines "packageManager": "yarnpnpm9.6.0". However the current global version of Yarn is 1.22.22.Presence of the "…

物联网数据归档之数据存储方案选择分析

在上一篇文章中《物联网数据归档方案选择分析》中凯哥分析了归档设计的两种方案,并对两种方案进行了对比。这篇文章咱们就来分析分析,归档后数据应该存储在哪里?及存储方案对比。 这里就选择常用的mysql及taos数据库来存储归档后的数据吧。 你在处理设备归档表存储方案时对…

八.MySQL复合查询

一.基本查询回顾 分组统计 group by 函数作用示例语句说明count(*)统计记录条数select deptno, count(*) from emp group by deptno;每个部门有多少人&#xff1f;sum(sal)某字段求和select deptno, sum(sal) from emp group by deptno;每个部门总工资avg(sal)求平均值select…

智能补丁管理:终结安全漏洞,开启自动化运维新时代

漏洞风暴&#xff1a;数字化时代的隐形战场 全球安全态势的范式转移 近年来&#xff0c;终端层漏洞已成为企业安全防线的最大突破口。根据美国国家标准与技术研究院&#xff08;NIST&#xff09;的监测数据&#xff0c;2023年新披露的高危漏洞数量同比增长62%&#xff0c;其中…

大模型 提示模板 设计

大模型 提示模板 设计 论文介绍:LangGPT - 从编程语言视角重构大语言模型结构化可复用提示设计框架 核心问题: 现有提示工程缺乏结构化设计模板,依赖经验优化,学习成本高且复用性低,难以支持提示的迭代更新。 创新思路: 受编程语言的结构化和可复用性启发,提出LangGP…

不连网也能跑大模型?

一、这是个什么 App&#xff1f; 你有没有想过&#xff0c;不用连网&#xff0c;你的手机也能像 ChatGPT 那样生成文字、识别图片、甚至回答复杂问题&#xff1f;Google 最近悄悄发布了一个实验性 Android 应用——AI Edge Gallery&#xff0c;就是为此而生的。 这个应用不在…

基于开源AI大模型与AI智能名片的S2B2C商城小程序源码优化:企业成本管理与获客留存的新范式

摘要&#xff1a;本文以企业成本管理的两大核心——外部成本与内部成本为切入点&#xff0c;结合开源AI大模型、AI智能名片及S2B2C商城小程序源码技术&#xff0c;构建了企业数字化转型的“技术-成本-运营”三维模型。研究结果表明&#xff0c;通过AI智能名片实现获客留存效率提…

【AFW+GRU(CNN+RNN)】Deepfakes Detection with Automatic Face Weighting

文章目录 Deepfakes Detection with Automatic Face Weighting背景pointsDeepfake检测挑战数据集方法人脸检测面部特征提取自动人脸加权门控循环单元训练流程提升网络测试时间增强实验结果Deepfakes Detection with Automatic Face Weighting 会议/期刊:CVPRW 2020 作者: …

【Zephyr 系列 6】使用 Zephyr + BLE 打造蓝牙广播与连接系统(STEVAL-IDB011V1 实战)

🧠关键词:Zephyr、BLE、广播、连接、GATT、低功耗蓝牙、STEVAL-IDB011V1 📌适合人群:希望基于 Zephyr 实现 BLE 通信的嵌入式工程师、蓝牙产品开发人员 🧭 前言:为什么选择 Zephyr 开发 BLE? 在传统 BLE 开发中,我们大多依赖于厂商 SDK(如 Nordic SDK、BlueNRG SD…

【前端后端环境】

学习视频【带小白做毕设02】从0开始手把手带你做Vue框架的快速搭建以及项目工程的讲解 C:\Users\Again>java -version java version "21.0.1" 2023-10-17 LTS Java(TM) SE Runtime Environment (build 21.0.112-LTS-29) Java HotSpot(TM) 64-Bit Server VM (buil…

机器学习:决策树和剪枝

本文目录&#xff1a; 一、决策树基本知识&#xff08;一&#xff09;概念&#xff08;二&#xff09;决策树建立过程 二、决策树生成&#xff08;一&#xff09;ID3决策树&#xff1a;基于信息增益构建的决策树。&#xff08;二&#xff09;C4.5决策树&#xff08;三&#xff…

【Vmware】虚拟机安装、镜像安装、Nat网络模式、本地VM8、ssh链接保姆篇(图文教程)

文章目录 Vmware下载Vmware安装镜像安装虚拟机安装网络模式Nat模式设置ssh链接 更多相关内容可查看 Vmware下载 官网下载地址&#xff1a;https://vmoc.waltzsy.com/?bd_vid8868926919570357435#goods Vmware安装 以管理员身份运行 弹框如下&#xff0c;点击下一步 我同意&…

移动端测试岗位高频面试题及解析

文章目录 一、基础概念二、自动化测试三、性能测试四、专项测试五、安全与稳定性六、高级场景七、实战难题八、其他面题 一、基础概念 移动端测试与Web测试的核心区别&#xff1f; 解析&#xff1a;网络波动&#xff08;弱网测试&#xff09;、设备碎片化&#xff08;机型适配&…

什么是“草台班子”?

“草台班子”是一个常用的汉语俗语&#xff0c;其含义在不同语境下略有差异&#xff0c;核心特点是强调组织或团队的非专业性、临时性和不规范性。以下从原意、引申义、常见用法三方面展开说明&#xff1a; 一、原意&#xff1a;传统戏曲中的流动演出团体 起源&#xff1a; 最…

无人机避障——感知部分(Ubuntu 20.04 复现Vins Fusion跑数据集)胎教级教程

硬件环境&#xff1a;NVIDIA Jeston Orin nx 系统&#xff1a;Ubuntu 20.04 任务&#xff1a;跑通 EuRoC MAV Dataset 数据集 展示结果&#xff1a; 编译Vins Fusion 创建工作空间vins_ws # 创建目录结构 mkdir -p ~/vins_ws/srccd ~/vins_ws/src# 初始化工作空间&#xf…

AI网校平台开发探索:集成直播、考试题库、白板互动的教育系统源码

当下&#xff0c;如何构建一个真正符合“未来教育”形态的网校平台&#xff0c;成为越来越多教育机构与技术团队关注的焦点。本篇文章&#xff0c;笔者想对教育系统源码的理解与实践&#xff0c;尤其是围绕直播、录播、考试题库与白板互动等核心功能的整合探索。 一、教育行业…

景区停车预警系统:从检测到疏导,告别拥堵!

节假日景区门口堵成长龙&#xff0c;游客找车位难&#xff0c;管理压力大&#xff1f;一套智能停车预警疏导系统是关键。4G地磁检测技术&#xff0c;是构建这套系统的稳定基石。 一、车位实时检测&#xff1a;数据精准是基础 知道车位有没有车、有多少空位是第一步。4G地磁埋…

仓颉项目调试配置与多文件场景下的问题解析

1. 调试配置指南 在 VS Code 中配置好仓颉开发工具链后&#xff0c;只需按下 F5 或 Fn F5 即可启动调试。 在 CodeArts IDE for Cangjie 中&#xff0c;需先通过右上角的 编辑配置 -> 新增配置项 -> 选择 Cangjie (cjdb) Debug -> 选择 launch 模式 -> 点击 确认…