C++中的栈和队列

news/2024/5/20 4:27:04

✨前言✨

📘 博客主页:to Keep博客主页
🙆欢迎关注,👍点赞,📝留言评论
⏳首发时间:2024年5月8日
📨 博主码云地址:博主码云地址
📕参考书籍:《C++ Primer》《C++编程规范》
📢编程练习:牛客网+力扣网
**由于博主目前也是处于一个学习的状态,如有讲的不对的地方,请一定联系我予以改正!!!

C++中栈和队列

    • 1 适配器
      • 1.1 适配器的介绍
      • 1.2 代码实现
      • 1.3 总结
    • 2 仿函数
    • 3 deque的原理(了解)

1 适配器

1.1 适配器的介绍

在C语言中,如果我们要实现栈和队列,就需要我们自己去手搓代码,并且实现底层利用的是顺序表还是链表也是有所不同的!在C++中还这样做,那你就慢了!在C++中我们学习了一些STL库中的容器,那么我们可不可以利用STL库中已经实现好的容器(vector,list,deque)呢?利用我们所学的模版,答案是可以的,所以像栈和队列这样的,并不需要自己去实现具体的函数,而是通过调用其他容器的函数而实现的,我们就称为适配器!事实上,适配器就是一种设计模式,它就是将一个类的接口转化成客户希望的另一个接口!

1.2 代码实现

我们首先来看看C++中对于栈的实现

#include <list>
namespace demo {template<class T,class Container = list<T>>class stack{public:void push(const T& x){_con.push_back(x);}void pop(){_con.pop_back();}T& top(){return _con.top();}size_t size(){return _con.size();}bool empty(){return _con.empty();}private:Container _con;};
}

可以发现,我们只是调用list已经实现好的函数,就可以实现一个栈了!我们甚至可以将上面的容器换成vector,接下来我们在看一下C++库中是默认什么容器来实现的:
在这里插入图片描述

从图中我们可以发现:
1️⃣库里面是利用deque这个容器来实现栈的(队列其实也是)
2️⃣凡是一个容器,只要实现了以上5个红框中的函数,就可以实现栈!

1.3 总结

栈和队列的实现都是套用了其他容器中的函数而完成的,这里只是简单的介绍了栈,队列其实也是同理的!

2 仿函数

在了解完什么事适配器之后,我们在来实现一下priority_queue

namespace demo{template<class T,class Container = deque<T>>class priority_queue{public:void adjust_up(size_t child){//大根堆为例size_t parent = (child - 1) / 2;while (child > 0){if (_con[child]>_con[parent]){swap(_con[parent], _con[child]);child = parent;parent = (child - 1) / 2;}else {break;}}}void adjust_down(size_t parent){size_t child = 2 * parent + 1;while (child<_con.size()){if (child + 1 < _con.size() && _con[child + 1] > _con[child]){child++;}if(_con[child]> _con[parent]){swap(_con[child], _con[parent]);parent = child;child = 2 * parent + 1;}else {break;}}}bool empty(){return _con.empty();}void push(const T& x){_con.push_back(x);//堆向上调整adjust_up(_con.size()-1);}size_t size(){return _con.size();}void pop(){swap(_con[0], _con[_con.size()-1]);_con.pop_back();//堆进行向下调整adjust_down(0);}T& top(){return _con.front();}private:Container _con;};
}

我们可以发现,这里只是实现了大根堆,那么我们如果要实现小根堆呢?我们还要亲自动手在改调整堆中的大于小于的符号吗?就不可以指定一个规则让它自己去比较大小呢,从而实现大根堆与小根堆之间的切换。库里面就是利用仿函数来实现的!在上面的代码中做出如下修改,并且多加入一个模版参数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们可以发现。只需要改变第三个模版参数,使用less< T >就是小根堆,使用greater< T >就是大根堆,就可以改变你要建立的是大根堆还是小根堆!那么明白了以上的场景,那么什么又是仿函数呢?
1️⃣仿函数不是一个函数,是一个类,在类中重载实现了运算符()
2️⃣我们是将该类的对象作为参数,传入到priority_queue中,从而调用()函数

3 deque的原理(了解)

在这里插入图片描述
deque的底层就如上图所示:数据会存储在大小一样的数据块上,有一个map数组,记录每段数据块的首地址,有两个迭代器,迭代器中四个指针的作用分为别:

cur:指向当前正在遍历的元素;
first:指向当前连续空间的首地址;
last:指向当前连续空间的末尾地址;
node:它是一个二级指针,用于指向 map 数组中存储的指向当前连续空间的指针。

正是由于deque有这样的结构,所以对于两端的插入与删除的效率就显得非常的高效,所以库底层会选择用deque来作为栈和队列的作为默认容器来配置!但是对于删除数据,以及遍历数据还是不如list与vector,所以deque还是不可以取代我们之前学过的这两个容器!


http://www.mrgr.cn/p/08074563

相关文章

何小鹏:活过淘汰赛,要做多边形战士下的规模第一

在北京车展上,小鹏汽车董事长 CEO 何小鹏接受媒体采访,就价格战、未来趋势、小米汽车等行业热点话题回答了媒体的提问。作为造车新势力的重要厂商,小鹏接下来也面临着市场淘汰赛的考验。 一方面是越来越激烈的价格战,另一方面还有小米、华为这样的科技大厂的强势入局,何小…

html--互动星空

<!doctype html> <html> <head> <meta charset"utf-8"> <title>互动星空</title><style> html,body {margin:0;overflow:hidden;width:100%;height:100%;cursor:none;background:black;background:linear-gradient(to bot…

翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深度学习二

合集 ChatGPT 通过图形化的方式来理解 Transformer 架构 翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深度学习一翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深度学习二翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深…

《最新出炉》系列入门篇-Python+Playwright自动化测试-44-鼠标操作-上篇

1.简介 前边文章中已经讲解过鼠标的拖拽操作,今天宏哥在这里对其的其他操作进行一个详细地介绍和讲解,然后对其中的一些比较常见的、重要的操作单独拿出来进行详细的介绍和讲解。 2.鼠标操作语法 鼠标操作介绍官方API的文档地址:https://playwright.dev/docs/api/class-mous…

windows下使用命令行查看已存储的wifi密码

netsh wlan show interface查看当前已连接wifi信息 netsh wlan show profiles查看所有已保存的wifi配置文件 netsh wlan show profiles name="XXXXXX" key="Clear"查看特定配置文件详情,包括wifi密码,密码在“关键内容”行

springboot lua检查redis库存

需求 最近需求需要实现检查多个马戏场次下的座位等席对应库存渠道的库存余量&#xff0c;考虑到性能&#xff0c;决定采用Lua脚本实现库存检查。 数据结构 库存层级结构 redis库存hash类型结构 实现 lua脚本 --- 字符串分割为数组 local function split(str, char)local…

JAVA IO/NIO 知识点总结

一、常见 IO 模型简介 1. 阻塞IO模型 最传统的一种IO模型&#xff0c;即在读写数据过程中会发生阻塞现象。当用户线程发出IO请求之后&#xff0c;内核会去查看数据是否就绪&#xff0c;如果没有就绪就会等待数据就绪&#xff0c;而用户线程就会处于阻塞状态&#xff0c;用户线…

和comate一起,用JavaScript实现一个简易版五子棋小游戏

前言 五子棋起源于中国&#xff0c;是全国智力运动会竞技项目之一&#xff0c;是一种两人对弈的纯策略型棋类游戏。双方分别使用黑白两色的棋子&#xff0c;下在棋盘直线与横线的交叉点上&#xff0c;先形成五子连珠者获胜。 这次和Baidu Comate智能代码助手共同完成这个小游戏…

9.3.k8s的控制器资源(deployment部署控制器)

目录 一、deployment部署控制器概念 二、deployment资源的清单编写 三、小结 功能 使用场景 原理 四、deployment实现升级和回滚 1.编辑deployment资源清单&#xff08;v1版本&#xff09; 2.创建service资源用于访问 ​编辑 3.修改deploy清单中pod镜像版本为V2 4…

如何分析慢SQL语句

如果一条sql执行很慢的话,通常会使用MySQL自动的执行计划explain来去查看这条sql的执行情况,比如在这里面可以通过key和key_len检查是否命中了索引,如果本身已经添加了索引,也可以判断索引是否有失效的情况,第二个,可以通过type字段查看sql是否有进一步的优化空间,是否存…

sonarqube(一)安装

一、前置条件: 安装工具如下:JDK MySql服务器 SonarQube SonarScanner二、下载和安装 1.jdk和mysql和sonar有版本对应的要求,sonar7.5对应jdk1.8和mysql>=5.6,<8.0 下载地址:http://www.sonarqube.org/downloads/ 下载完成后解压后点击StartSonar.bat启动即可。 或者…

shell翻译官

shell脚本概述 shell的作用&#xff1a; 完成自动化运维工作&#xff0c;批量完成重复操作&#xff0c;结合crontab完成周期性任务 shell编程规范&#xff1a; Shell脚本的编写 vim XXX.sh 1.申明解释器 #!/bin/bash #!/bin/python 2.编写注释信息 要以 # 号开…

Verilog中4位数值比较器电路

某4位数值比较器的功能表如下。 请用Verilog语言采用门级描述方式&#xff0c;实现此4位数值比较器 参考代码如下&#xff1a; &#xff08;CSDN代码块不支持Verilog&#xff0c;代码复制到notepad编辑器中&#xff0c;语言选择Verilog&#xff0c;看得更清楚&#xff09; t…

项目计划书(Word原件)

项目开发计划包括项目描述、项目组织、成本预算、人力资源估算、设备资源计划、沟通计划、采购计划、风险计划、项目过程定义及项目的进度安排和里程碑、质量计划、数据管理计划、度量和分析计划、监控计划和培训计划等。 软件资料清单列表部分文档&#xff1a; 工作安排任务书…

《Python编程从入门到实践》day21

# 昨日知识点回顾 设置背景颜色 在屏幕中央绘制飞船 # 今日知识点学习 12.5 重构&#xff1a;方法_check_events()和_update_screen() 12.5.1 方法_check_events() import sys import pygame from Settings import Settings from Ship import Shipclass AlienInvasion:"…

java的三种编译(JAVAC,JIT,AOT)

1.javac把java代码编译成字节码(中间代码),然后由java虚拟机解释执行 2.jit(运行时编译)把java代码直接编译成机器码,然后由java虚拟机直接运行(缓存)。有对客户端的C1和对服务器端的C2编译器 缓存 代码优化 逃逸分析,是否超出范围。对不同逃逸状态做优化 全局逃逸 对象超…

怎么设置一天多个时间点的闹钟提醒?

在日常生活中,我们经常需要在一天的不同时间点完成特定的任务,如定时喝水、定时查看后台数据、定时吃药等。这时候,如果能有一款软件,可以在一条日程里轻松设置多个时间点的闹钟提醒,那将大大提高我们的工作效率和生活品质。 那么怎么设置一天多个时间点的闹钟提醒呢?定时…

sql优化思路

sql的优化经验 这里解释一下SQL语句的优化的原理 1.指明字段名称&#xff0c;可以尽量使用覆盖索引&#xff0c;避免回表查询&#xff0c;因此可以提高效率 2.字面意思&#xff0c;无需过多赘述。索引就是为了提高查询效率的。 3.图中两条sql直接可以使用union all 或者 uni…

智慧工地,筑牢安全防线:严防塔吊相撞,守护施工安全之巅!

塔吊相撞的事故是一个严重的施工安全问题&#xff0c;而智慧工地则是一种利用现代科技手段提高施工安全性的解决方案。 为了避免类似事故的发生&#xff0c;智慧工地可以采取以下措施&#xff1a; 一、建立全面的监控系统 智慧工地可以建立完善的监控系统&#xff0c;通过安装…

GreatSQL的sp中添加新的sp_instr引入的bug解析

GreatSQL的sp中添加新的sp_instr引入的bug解析 一、问题发现 在一次开发中用到的sp需要添加新的sp_instr以满足需求,但是添加了数个sp_instr以后发现执行新的sp会发生core。注:本次使用的GreatSQL 8.0.32-251、sp_head.cc的init_sp_psi_keys()代码里面添加10个新的sp_instr:…