【C++ 】stack 和 queue

1. 标准库中的stack

stack 的介绍:

1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行 元素的插入与提取操作

2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出

3. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类

a. stack 的使用

注意:

如果要访问所有元素得到栈顶元素,再pop,直到为空

2. stack的模拟实现

代码

namespace lhy
{ template<class T,class container = vector<T>>class stack{public:void push(const T& x){_t.push_back(x);}void pop(){_t.pop_back();}size_t size(){return _t.size();}bool empty(){return _t.empty();}const T& top(){return _t.back();}private:container _t;};

//用法很像缺省参数,不过这里缺省的是类型

3. 标准库中的queue

queue 的介绍:

1. 队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素

2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列

3. 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类

a. queue 的使用

4. queue的模拟实现

代码

namespace lhy
{ template<class T,class container = list<T>>class queue{public:void push(const T& x){_v.push_back(x);}void pop(){_v.pop_front();}bool empty(){return _v.size() == 0;}const T& back(){return _v.back();}const T& front(){return _v.front();}size_t size(){return _v.size();}private:container _v;};

5. priority_queue (优先级队列)

优先级队列的介绍:

优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成堆的结构

因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue

注意:

默认情况下priority_queue是大堆

a. priority_queue 的使用

  • priority_queue() (无参构造函数)
  • priority_queue(InputIterator first, InputIterator last)
  • empty() (判空)
  • push() (尾插)
  • pop () (删除栈顶元素,即第一个元素)
  • top() (返回栈顶元素)

6. priority_queue 的模拟实现

代码

namespace lhy
{template<class T>struct less{bool operator()(const T& x, const T& y){return x > y;}};template<class T>struct greater{bool operator()(const T& x, const T& y){return x < y;}};template<class T, class container = vector<T>, class compare = less<T>>class priority_queue{private:container con;void AdjustUp(int child){int parent = (child - 1) / 2;while (child > 0){if (compare()(con[parent], con[child])){std::swap(con[parent], con[child]);}else{break;}child = parent;parent = (child - 1) / 2;}}void AdjustDown(int parent){int child = parent * 2 + 1;while (child < size()){if (child + 1 < size() && con[child] > con[child + 1]){child++;}if (compare()(con[parent], con[child])){std::swap(con[parent], con[child]);}else{break;}parent = child;child = parent * 2 + 1;}}public:size_t size(){return con.size();}void push(const T & x){con.push_back(x);AdjustUp(size() - 1);}void pop(){swap(con[0], con[size() - 1]);con.pop_back();AdjustDown(0);}bool empty(){return con.empty();}const T& top(){return con[0];}};
}

代码注意事项

这两个类实际上又可以说成伪函数,这里通过比较大小判断建大堆还是小堆

用法如下:

compare()是匿名对象,后面接着是调用 less 类 或者 greater 类的运算符重载()

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW电磁阀特性测控系统

LabVIEW电磁阀特性测控系统 电磁阀作为自动化工程中的重要组成部分&#xff0c;其性能直接影响系统的稳定性和可靠性。设计一种基于LabVIEW的电磁阀特性测控系统&#xff0c;通过高精度数据采集和智能化控制技术&#xff0c;实现电磁阀流阻、响应时间及脉冲特性的准确测量和分…

接口的回调

接口是引用型变量 接口回调技术&#xff1a;把实现该接口的类的实例引用赋给接口变 量&#xff08;存放对象的引用&#xff09;→接口变量可调用被类重写的接口方法。 ★注意★&#xff1a;接口com无法调用类中非接口方法

MySQL基础---SQL语句2(WHERE、AND、OR、ORDER BY、COUNT)

1. WHERE 子句 1. 语法 WHERE 子句用于限定选择的标准 在 slelece、update、delete 语句中&#xff0c;皆可使用 WHERE 子句来限定选择的标准 -- 查询语句 select 列名称 form 表名称 where 列 运算符 值-- 更新语句 update 列名称 form 列新值 where 列 运算符 值-- 删除语句…

数据库中的数据

从数据库查到的数据&#xff0c;是这种JSON格式,建和值都是双引号包裹 [[{id: 21,name: why,password: e10adc3949ba59abbe56e057f20f883e,createAt: 2024-03-11T06:55:35.000Z,updateAt: 2024-03-11T06:55:35.000Z}],[id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,name VARCH…

3.2 RK3399项目开发实录-初次使用的环境搭建(物联技术666)

通过百度网盘分享的文件&#xff1a;嵌入式物联网单片… 链接:https://pan.baidu.com/s/1Zi9hj41p_dSskPOhIUnu9Q?pwd8qo1 提取码:8qo1 复制这段内容打开「百度网盘APP 即可获取」 1. 用户和密码 1.1. Ubuntu Desktop 系统 Ubuntu Desktop 系统开机启动后&#xff0c;自动登录…

图片或视频充当网页背景+过渡动画

这是目前的主页预览图。上一个版本带有学校logo&#xff0c;根据比赛规则&#xff0c;删掉了学校logo。 图片背景 也就是将图片作为背景。 这个需求产生的场景是&#xff1a;如果直接用img标签显示界面左上角的logo&#xff0c;那么鼠标右键是可以直接选中图片的&#xff0c…

DirectPV的故事

2020 年&#xff0c;MinIO 为基于 Kubernetes 的 MinIO 存储部署实施了直接持久卷 &#xff08;DirectPV&#xff09;。DirectPV 类似于 LocalPV&#xff0c;但动态预配。 在这篇文章中&#xff0c;我将介绍创建 DirectPV 的有趣设计决策。但在深入了解设计细节之前&#xff0c…

Logseq电脑端+安卓端同步gitee或github

文章目录 0.初衷1.电脑端1.1 新建仓库1.2 克隆项目&#xff0c;生成秘钥1.3 添加图谱&#xff0c;选择文件目录&#xff0c;我是原本就有笔记&#xff0c;所以会如下所示。1.4 下载脚本文件1.5赋权限 &#xff08;windows可跳过&#xff09;1.6 修改脚本命令1.7 logseq设置同步…

es 聚合操作(二)

书接上文&#xff0c;示例数据在上一篇&#xff0c;这里就不展示了 一、Pipeline Aggregation 支持对聚合分析的结果&#xff0c;再次进行聚合分析。 Pipeline 的分析结果会输出到原结果中&#xff0c;根据位置的不同&#xff0c;分为两类&#xff1a; Sibling - 结果和现有…

CentOS无法解析部分网站(域名)

我正在安装helm软件&#xff0c;参考官方文档&#xff0c;要求下载 get-helm-3 这个文件。 但是我执行该条命令后&#xff0c;报错 连接被拒绝&#xff1a; curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 # curl: (7) Fai…

2.MongoDB与关系数据库对比

MongoDB的简单操作与比较 与关系数据库对比 MySQL与MongoDB都是开源的常用数据库&#xff0c;但是MySQL是传统的关系型数据库&#xff0c;MongoDB则是非关系型数据库&#xff0c;也叫文档型数据库&#xff0c;是一种NoSQL的数据库。它们各有各的优点&#xff0c;来看看他们之…

两个高斯分布的KL散度绘制动画

KL散度 KL散度用于衡量两个变量分布之间的差异性 K L ( P ∣ ∣ Q ) ∫ − ∞ ∞ p ( x ) log ⁡ p ( x ) q ( x ) d x (1) KL(P\ ||\ Q)\int_{-\infty}^{\infty}p(x)\log\frac{p(x)}{q(x)}dx\tag{1} KL(P ∣∣ Q)∫−∞∞​p(x)logq(x)p(x)​dx(1) P、Q为随机变量X的两个概…