c++ std::stack总结
概念
std::stack
是 C++ 标准库中的一个容器适配器(Container Adapter)。它通常是基于其他容器(如 std::deque
或 std::vector
)实现的,提供了一个后进先出(LIFO,Last In First Out)的元素访问顺序。栈只能在栈顶(top)进行插入和删除操作,因此它只暴露了有限的接口,操作简单高效。
特点
-
后进先出(LIFO):栈总是从栈顶访问元素,栈顶的元素总是最新的。
-
动态大小:栈的大小可以动态增长和缩小,当有元素压入或弹出时栈的大小会相应改变。
-
封装性强:
std::stack
不允许直接访问底层容器的数据(除了栈顶元素),保证了栈操作的封装性。
成员函数
push()
: 向栈顶插入元素。
stack.push(value); // 将元素 value 压入栈顶
pop()
: 弹出栈顶元素。
stack.pop(); // 移除栈顶元素
top()
: 获取栈顶元素,但不移除它。
stack.top(); // 返回栈顶元素
empty()
: 检查栈是否为空。
stack.empty(); // 如果栈为空返回 true,否则返回 false
size()
: 返回栈中的元素数量。
stack.size(); // 返回栈的元素数量
底层容器
std::stack
是一个容器适配器,意味着它依赖于底层容器来存储数据。默认情况下,std::stack
使用 std::deque
作为底层容器,也可以显式选择使用 std::vector
或 std::list
。
std::stack
是一个模板类,它可以接受两个模板参数:
- 元素类型(
T
):栈中存储的元素类型。 - 底层容器类型(
Container
):用于存储元素的底层容器类型,默认是std::deque<T>
。
第二个参数允许我们指定底层容器,如 std::vector
或 std::list
。底层容器必须支持以下操作:
push_back()
pop_back()
back()
empty()
- size()
示例一:常规用法
#include <iostream>
#include <stack>int main() {std::stack<int> s;// 向栈中压入元素s.push(10);s.push(20);s.push(30);// 输出栈顶元素std::cout << "Top element: " << s.top() << std::endl; // 输出 30// 弹出栈顶元素s.pop();// 输出新的栈顶元素std::cout << "New top element: " << s.top() << std::endl; // 输出 20// 检查栈是否为空if (s.empty()) {std::cout << "The stack is empty" << std::endl;} else {std::cout << "The stack is not empty" << std::endl; // 输出栈不为空}// 输出栈的大小std::cout << "Stack size: " << s.size() << std::endl; // 输出 2return 0;
}
示例二:使用 std::vector作为底层容器
#include <iostream>
#include <stack>
#include <vector>int main() {// 使用 std::vector 作为底层容器std::stack<int, std::vector<int>> s;s.push(10);s.push(20);s.push(30);// 输出栈顶元素std::cout << "Top element: " << s.top() << std::endl; // 输出 30s.pop();std::cout << "New top element: " << s.top() << std::endl; // 输出 20std::cout << "Stack size: " << s.size() << std::endl; // 输出 2return 0;
}
示例三:使用 std::list作为底层容器
#include <iostream>
#include <stack>
#include <list>int main() {// 使用 std::list 作为底层容器std::stack<int, std::list<int>> s;s.push(100);s.push(200);s.push(300);// 输出栈顶元素std::cout << "Top element: " << s.top() << std::endl; // 输出 300s.pop();std::cout << "New top element: " << s.top() << std::endl; // 输出 200std::cout << "Stack size: " << s.size() << std::endl; // 输出 2return 0;
}
示例四:自定义容器
#include <iostream>
#include <stack>
#include <deque>// 自定义容器(必须支持 push_back, pop_back, back, size, empty)
template<typename T>
class CustomContainer {
private:std::deque<T> data; // 使用 deque 存储数据
public:void push_back(const T& value) { data.push_back(value); }void pop_back() { data.pop_back(); }T& back() { return data.back(); }const T& back() const { return data.back(); }bool empty() const { return data.empty(); }size_t size() const { return data.size(); }
};int main() {// 使用自定义容器作为底层容器std::stack<int, CustomContainer<int>> s;s.push(42);s.push(84);s.push(126);std::cout << "Top element: " << s.top() << std::endl; // 输出 126s.pop();std::cout << "New top element: " << s.top() << std::endl; // 输出 84std::cout << "Stack size: " << s.size() << std::endl; // 输出 2return 0;
}
适用场景
-
表达式求值(后缀表达式,逆波兰表示法):栈常用于计算后缀表达式或中缀表达式的转换。
-
括号匹配:栈常用于检查表达式中的括号是否匹配。
-
深度优先搜索(DFS):在图的遍历中,栈用于模拟递归的调用栈。
-
回溯算法:栈可以用于回溯算法的状态追踪。
-
撤销操作:栈可用于实现撤销操作的功能,在需要回退到上一步的场景中非常有用。
性能
-
时间复杂度:
push()
、pop()
、top()
、empty()
、size()
操作都是常数时间 O(1)。 -
空间复杂度:
std::stack
使用底层容器存储数据,因此其空间复杂度取决于底层容器的实现(std::deque
或std::vector
)。
总结
std::stack
是一个非常简单且高效的容器适配器,适合处理需要后进先出(LIFO)顺序的场景。它提供了基本的栈操作:压栈、弹栈、查看栈顶元素、检查栈是否为空等。它常用于表达式求值、图的遍历、括号匹配等实际问题。
相关文章:
c++ std::stack总结
概念 std::stack 是 C 标准库中的一个容器适配器(Container Adapter)。它通常是基于其他容器(如 std::deque 或 std::vector)实现的,提供了一个后进先出(LIFO,Last In First Out)的…...
【C++习题】10.反转字符串中的单词 lll
题目: 链接🔗:557.反转字符串中的单词 lll 题目: 代码: class Solution { public:void Reverse(string &s, int start, int end){char tmp;while(start < end){tmp s[start];s[start] s[end];s[end] tmp;…...
【pyspark学习从入门到精通14】MLlib_1
目录 包的概览 加载和转换数据 在前文中,我们学习了如何为建模准备数据。在本文中,我们将实际使用这些知识,使用 PySpark 的 MLlib 包构建一个分类模型。 MLlib 代表机器学习库。尽管 MLlib 现在处于维护模式,即它不再积极开发…...
transformer.js(四): 模型接口介绍
前面的文章底层架构及性能优化指南介绍了transformer.js的架构和优化策略,在本文中,将详细介绍 transformer.js 的模型接口,帮助你了解如何在 JavaScript 环境中使用这些强大的工具。 推荐阅读 ansformer.js(二)&…...
java集合练习题
简答题:分析HashSet和treeSet分别如何去重的? TreeSet的去重机制: 如果你传入了一个Comparator匿名对象,就使用实现的compare去重,如果方法返回0,就认为是相同的元素/数据,就不添加,如果你没有传入一个Comp…...
微知-plantuml常用语法和要点以及模板?(note over、create、box,endbox、alt,else,end, autonumber)
文章目录 常见语法常用 线条类实线虚线斜箭头或奇数箭头 A ->(10) B: B->(10) A分割线:newpage 颜色类给箭头指定颜色 -[#red]->给某个note加颜色: note over Alice, Bob #FFAAAA: xxx给分组信息着色 alt#red 分组类alt xxx; else xxx; else xx…...
gitHub常用操作
gitHub常用操作 1、把项目拉下来2、添加上游仓库3、进入分支4、从上游仓库拉取更新 1、把项目拉下来 在对应项目的右上角点击fork,fork下来:将远程仓库复制到个人仓库 在创建好的分支文件夹下使用 git clone自己远程仓库下的http地址(fork…...
Mybatis Plus动态指定数据源
Java开发中一个项目连接多个数据源时,可能会有需要动态指定一个方法所使用的数据源的场景。例如不同的用户查询不同的数据源。 我遇到的需求是这样的:设计一个公共的数据字典组件,该组件需要连接数据源,使用方引入该组件后可以直…...
Python 爬虫 (1)基础 | 基础操作
一、基础操作 1、快速构建一个爬虫 ConvertCurl: https://curlconverter.com/选择URL,点击右键,选择 Copy >> Copy as cURL(bash) 安装JS环境:https://www.jb51.net/python/307069k7q.htm...
C++
目录 C 的发展总结:编辑 1. C 的早期发展(1979-1985) 2. C 标准化过程(1985-1998) 3. C 标准演化(2003-2011) 4. C11(2011年) 5. C14(2014年…...
Infineon(英飞凌) TLE985xQX 芯片电机工作电流、电压AD采样
其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 单片机芯片合集 文章目录 其他系列文章导航 文章目录 前言 一、选取合适的端口 1.通过 OP1、OP2 电流采集运放输入端口进行H桥驱动的电流采集。 2.通过 O_D_VBAT_AD_EN、I_A_VBAT_A…...
三极管工作原理,以及小电流,如何驱动大电流
因为研究【自动下载电路实现】,涉及到三极管内容,之前看过,现在回看之前的笔记,一点印象都没了,于是,想了个办法,记住它 个人联想,不喜绕道,只是帮助个人记忆的 标题也是…...
Haystack 的开源开发 LLM 应用设计框架
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
彻底理解消息队列的作用及如何选择
一.为什么要使用消息队列? 使用消息队列,其实是需要根据实际业务场景来的,一般都是实际开发中,遇到了某种技术挑战,如果不使用MQ的话,业务实现起来比较麻烦,但是通过MQ就可以更快捷高效的实现业…...
【Java】二叉树:数据海洋中灯塔式结构探秘(上)
个人主页 🌹:喜欢做梦 二叉树中有一个树,我们可以猜到他和树有关,那我们先了解一下什么是树,在来了解一下二叉树 一🍝、树型结构 1🍨.什么是树型结构? 树是一种非线性的数据结构&…...
海洋通信船舶组网工业4G路由器应用
船舶是浩瀚海洋中探索与贸易的载体,更是船员们生活与工作的家园。为了在广阔的水域中搭建起稳定、高效的网络桥梁,工业4G路由器以卓越的通信组网能力,为船舶组网提供网络支持。 工业4G路由器以其强大的信号发射能力,确保船舶内部…...
字符串-07-判断两个IP是否属于同一子网
文章目录 1. 题目描述2. 思路3. 代码 1. 题目描述 IP地址是由4个0-255之间的整数构成的,用"."符号相连。 二进制的IP地址格式有32位,例如:10000011,01101011,00000011,00011000;每八…...
Django启用国际化支持(2)—实现界面内切换语言:activate()
文章目录 ⭐注意⭐1. 配置项目全局设置:启用国际化2. 编写视图函数3. 配置路由4. 界面演示5、扩展自动识别并切换到当前语言设置语言并保存到Session设置语言并保存到 Cookie ⭐注意⭐ 以下操作依赖于 Django 项目的国际化支持。如果你不清楚如何启用国际化功能&am…...
自定义协议
1. 问题引入 问题:TCP是面向字节流的(TCP不关心发送的数据是消息、文件还是其他任何类型的数据。它简单地将所有数据视为一个字节序列,即字节流。这意味着TCP不会对发送的数据进行任何特定的边界划分,它只是确保数据的顺序和完整…...
PHP Date 函数:日期和时间处理的全指南
PHP Date 函数:日期和时间处理的全指南 PHP Date 函数是 PHP 编程语言中用于处理日期和时间的核心函数之一。它提供了强大的功能,允许开发者轻松地格式化、计算和操作日期和时间值。本文将详细介绍 PHP Date 函数的用法,包括基本格式化、时间戳处理、时区设置以及一些高级特…...
C++设计模式:抽象工厂模式(风格切换案例)
抽象工厂模式(Abstract Factory)是一种创建型设计模式,其核心思想是:为一组相关或相互依赖的对象提供一个创建接口,而无需指定它们具体的类。简单来说,就是一个工厂可以生产一系列相关的对象。 我们接下来…...
社交媒体营销新趋势:如何通过海外平台提升品牌曝光度?
社交媒体不仅是简单的信息传播工具,更是连接用户与品牌之间的重要纽带。每天,有数以亿计的全球用户在不同平台上活跃,潜藏着巨大的市场潜力。对于企业来说,关键在于制定清晰的营销策略,精准把握不同社交平台的特性&…...
嵌入式C/C++编译常见问题与分析
#1 kcx.c:112:89: error: format specifies type unsigned int but the argument has type u32 * (aka unsigned int *) [-Werror,-Wformat] 报错原因: int kcx(u32 *trigger) { ERR_MSG("%s:failed. attr%d, trigger%u\n", __func__, attr_enable, trig…...
laravel 5.5 增加宏指令 joinSub, 省去->toSql() 和 addBinding($bindings);
laravel 5.5 增加宏指令 joinSub, 省去->toSql() 和 addBinding($bindings); 1. 在laravel5使用join 子查询时 $sub_query DB::table(table1)->select([table1.id, cate_id])->join(table2, table1.id, , table2.id)->where(table1.cate_id, 2)->orderBy(tabl…...
知识库搭建:大健康产业数字化转型的新引擎
随着数字经济的蓬勃发展,大健康产业正步入一个崭新的发展篇章。消费者对于健康的追求日益增长,促使大健康企业积极探索数字化路径,以提升供应链效率、控制成本,并在激烈的市场竞争中脱颖而出。在此过程中,一系列数字化…...
创建可重用React组件的实用指南
尽管React是全球最受欢迎和使用最广泛的前端框架之一,但许多开发者在重构代码以提高可复用性时仍然感到困难。如果你发现自己在React应用中不断重复相同的代码片段,那你来对地方了。 在本教程中,将向你介绍三个最常见的特征,表明是…...
蓝桥杯每日真题 - 第18天
题目:(出差) 题目描述(13届 C&C B组E题) 解题思路: 问题分析 问题实质是一个带权图的最短路径问题,但路径的权重包含两个部分: 从当前城市到下一个城市的路程时间。 当前城市的…...
MySQL中索引全详解
第一部分:什么是索引 索引在数据库中就像书的目录,能够快速定位数据位置,从而提升查询效率。没有索引时,数据库查询需要从头到尾扫描整个表(称为全表扫描),这在数据量大时非常耗时。有了索引后&…...
探索复合物TPP-PEG-Heparin的特性;磷酸三苯酯-聚乙二醇-肝素的线粒体靶向性
TPP-PEG-Heparin,即磷酸三苯酯(TPP)、聚乙二醇(PEG)和肝素(Heparin)的复合物,其特性融合了这三种成分的性质。 一、线粒体靶向性 TPP部分:具有线粒体靶向功能…...
ubuntu 配置 多个 git 客户端 账户
Git配置两个或多个账户 https://blog.csdn.net/mainking2003/article/details/134711865 git 提交 不用输入用户名、密码的方法(GIT免密提交) https://blog.csdn.net/wowocpp/article/details/125797263 git config 用法 https://blog.csdn.net/blueb…...
Web3与智能合约:区块链技术下的数字信任体系
随着互联网的不断发展,Web3代表着我们迈入了一个去中心化、更加安全和智能的网络时代。作为Web3的核心组成部分,区块链技术为智能合约的出现和发展提供了强有力的基础。智能合约不仅仅是自动化的代码,它们正逐步成为重塑数字世界信任体系的关…...
RocketMQ文件刷盘机制深度解析与Java模拟实现
引言 在现代分布式系统中,消息队列(Message Queue, MQ)作为一种重要的中间件,扮演着连接不同服务、实现异步通信和消息解耦的关键角色。Apache RocketMQ作为一款高性能的分布式消息中间件,广泛应用于实时数据流处理、…...
高级编程之结构化代码
背景:以下没结构化代码之前,定时器同步店铺信息的代码。 结构化的思想:SRP(单一职责),一个方法是做一件事,层次是相关的,逻辑和数据操作进行拆分,数据操作从业务流程上定…...
学习编程,学习中间件,学习源码的思路
01 看的多,内化不足 最近想复习一下编程相关的知识,在复习前我翻开了之前的一些笔记,这些笔记基本都是从书本、视频、博客等摘取记录的,看着这些笔记心里总结:看的多,内化不足。 02 整理大纲 为了解决这个…...
网络安全与加密
1.Base64简单说明描述:Base64可以成为密码学的基石,非常重要。特点:可以将任意的二进制数据进行Base64编码结果:所有的数据都能被编码为并只用65个字符就能表示的文本文件。65字符:A~Z a~z 0~9 / 对文件进行base64编码…...
开源协议介绍
文章目录 1. MIT License2. Apache License 2.03. GNU General Public License (GPL)4. GNU Lesser General Public License (LGPL)5. BSD License6. Mozilla Public License (MPL)7. Creative Commons Licenses (CC)8. Unlicense选择建议 在 开源平台上,开源项目通…...
Java技术复习提升 10异常
10 异常 10.1异常介绍及分类 异常捕获 选中后alttabt->选中try-catch 异常就是程序执行中不正常的情况 注意语法和逻辑错误并不是异常 异常分类有两种 error和exception error是错误 虚拟机无法解决的严重问题 exception是其他因为编程错误或者外在因素导致的一般性的问…...
java版工程项目管理系统源码:Spring Cloud与前后端分离的完美结合
在现代化的工程项目管理中,一套功能全面、操作便捷的系统至关重要。本文将介绍一个基于Spring Cloud和Spring Boot技术的Java版工程项目管理系统,结合Vue和ElementUI实现前后端分离。该系统涵盖了项目管理、合同管理、预警管理、竣工管理、质量管理等多个…...
Oracle与MySQL中CONCAT()函数的使用差异
一、CONCAT函数介绍 CONCAT函数是MySQL等数据库中用于连接两个或多个字符串的内置函数。其基本语法如下: CONCAT(string1, string2, ...)参数说明: string1, string2, …:需要连接的字符串参数,可以有多个。 返回值࿱…...
AI社媒引流工具:解锁智能化营销的新未来
在数字化浪潮的推动下,社交媒体成为品牌营销的主战场。然而,面对海量的用户数据和日益复杂的运营需求,传统营销方法显得力不从心。AI社媒引流王应运而生,帮助企业在多平台中精准触达目标用户,提升营销效率和效果。 1.…...
浏览器的事件循环机制
一、请简述浏览器的事件循环机制(Event Loop)基本原理 浏览器的事件循环机制是用于协调处理 JavaScript 中的异步任务与同步任务执行顺序的一种机制,它确保了代码能够按照合理的顺序执行,避免阻塞页面渲染等情况。其基本原理如下…...
如何在 React 项目中应用 TypeScript?应该注意那些点?结合实际项目示例及代码进行讲解!
在 React 项目中应用 TypeScript 是提升开发效率、增强代码可维护性和可读性的好方法。TypeScript 提供了静态类型检查、自动补全和代码提示等功能,这对于 React 开发者来说,能够帮助早期发现潜在的 bug,提高开发体验。 1. 项目初始化 在现…...
排序算法(五)--归并排序
文章目录 引言归并排序概述C语言实现代码解析结论 归并排序 C语言实例 引言 归并排序(Merge Sort)作为一种经典的排序算法,以其稳定性、分治法的巧妙应用以及相对高效的时间复杂度而著称。 归并排序概述 归并排序采用分治法(Di…...
Linux KASLR 地址偏移
kaslr开启时地址 cat /proc/cmdline BOOT_IMAGE/boot/vmlinuz-5.4.0-193-generic rootUUID0e46dee3-4557-434a-a2d2-a35c6ad3d327 ro find_preseed/preseed.cfg auto noprompt prioritycritical localeen_US quiet cat /boot/config-$(uname -r) | grep CONFIG_RANDOMIZE_B…...
利用开源图床的技巧与实践
随着互联网的普及,图片的使用变得越来越广泛。无论是个人博客、社交媒体还是企业网站,都离不开图片的呈现。而图床作为图片存储和管理的工具,可以帮助开发者和内容创作者高效地管理图片资源。本文将探讨如何利用开源图床,并提供相…...
Unity Lua方向的面试真题详解
最近有位同学面试Unity,面试的公司采用Lua的方案来做公司项目,我们把面试时问道的真题列举出来,并配上参考回复。 1、Lua热更文件时,文件是重写的,还是只写一部分? 热更分为资源更新和代码更新,资源更新…...
经验笔记:Git 基础操作指南
推荐一下Gitee最好的Git操作教程:Learn Git Branching 经验笔记:Git 基础操作指南 1. 安装 Git 首先确保您的计算机上已安装 Git。如果还没有安装,可以从 Git官网 下载并安装。 2. 配置 Git 安装完成后,打开命令行工具&#…...
大模型在智能客服中心领域的应用思考
大模型在智能客服中心领域的应用思考 作者:开源呼叫中心系统 FreeIPCC,Github地址:https://github.com/lihaiya/freeipcc 随着人工智能技术的飞速发展,特别是深度学习技术的突破,大型语言模型(LLMs&#x…...
ssm旅游推荐系统的设计与开发
摘 要 旅游推荐系统是一个综合性的在线旅游推荐平台,旨在为用户提供便捷的旅游规划和预定服务。通过该系统,用户能够浏览各类景点信息并进行分类查找,同时获取详尽的景点介绍和相关照片,以辅助做出旅行决策。系统提供在线门票订购…...
C++从零到满绩——入门基础and类和对象(上)
目录 1>>前言 2>>函数重载 3>>引用 3.1>>引用的概念 3.2>>引用三大特性 3.3>>引用的使用 3.4>>const引用 3.5>>指针与引用的关系 4>>inline内联函数 5>>nullptr 6>>类和对象(上&#…...