当前位置: 首页 > news >正文

c++ std::stack总结

概念

std::stack 是 C++ 标准库中的一个容器适配器(Container Adapter)。它通常是基于其他容器(如 std::dequestd::vector)实现的,提供了一个后进先出(LIFO,Last In First Out)的元素访问顺序。栈只能在栈顶(top)进行插入和删除操作,因此它只暴露了有限的接口,操作简单高效。

特点

  • 后进先出(LIFO):栈总是从栈顶访问元素,栈顶的元素总是最新的。

  • 动态大小:栈的大小可以动态增长和缩小,当有元素压入或弹出时栈的大小会相应改变。

  • 封装性强std::stack 不允许直接访问底层容器的数据(除了栈顶元素),保证了栈操作的封装性。

成员函数

  1. push(): 向栈顶插入元素。
stack.push(value);  // 将元素 value 压入栈顶
  1. pop(): 弹出栈顶元素。
stack.pop();  // 移除栈顶元素
  1. top(): 获取栈顶元素,但不移除它。
stack.top();  // 返回栈顶元素
  1. empty(): 检查栈是否为空。
stack.empty();  // 如果栈为空返回 true,否则返回 false
  1. size(): 返回栈中的元素数量。
stack.size();  // 返回栈的元素数量

底层容器

std::stack 是一个容器适配器,意味着它依赖于底层容器来存储数据。默认情况下,std::stack 使用 std::deque 作为底层容器,也可以显式选择使用 std::vectorstd::list

std::stack 是一个模板类,它可以接受两个模板参数:

  1. 元素类型(T:栈中存储的元素类型。
  2. 底层容器类型(Container:用于存储元素的底层容器类型,默认是 std::deque<T>

第二个参数允许我们指定底层容器,如 std::vectorstd::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::dequestd::vector)。

总结

std::stack 是一个非常简单且高效的容器适配器,适合处理需要后进先出(LIFO)顺序的场景。它提供了基本的栈操作:压栈、弹栈、查看栈顶元素、检查栈是否为空等。它常用于表达式求值、图的遍历、括号匹配等实际问题。

相关文章:

c++ std::stack总结

概念 std::stack 是 C 标准库中的一个容器适配器&#xff08;Container Adapter&#xff09;。它通常是基于其他容器&#xff08;如 std::deque 或 std::vector&#xff09;实现的&#xff0c;提供了一个后进先出&#xff08;LIFO&#xff0c;Last In First Out&#xff09;的…...

【C++习题】10.反转字符串中的单词 lll

题目&#xff1a; 链接&#x1f517;&#xff1a;557.反转字符串中的单词 lll 题目&#xff1a; 代码&#xff1a; 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

目录 包的概览 加载和转换数据 在前文中&#xff0c;我们学习了如何为建模准备数据。在本文中&#xff0c;我们将实际使用这些知识&#xff0c;使用 PySpark 的 MLlib 包构建一个分类模型。 MLlib 代表机器学习库。尽管 MLlib 现在处于维护模式&#xff0c;即它不再积极开发…...

transformer.js(四): 模型接口介绍

前面的文章底层架构及性能优化指南介绍了transformer.js的架构和优化策略&#xff0c;在本文中&#xff0c;将详细介绍 transformer.js 的模型接口&#xff0c;帮助你了解如何在 JavaScript 环境中使用这些强大的工具。 推荐阅读 ansformer.js&#xff08;二&#xff09;&…...

java集合练习题

简答题&#xff1a;分析HashSet和treeSet分别如何去重的&#xff1f; TreeSet的去重机制: 如果你传入了一个Comparator匿名对象&#xff0c;就使用实现的compare去重&#xff0c;如果方法返回0,就认为是相同的元素/数据&#xff0c;就不添加&#xff0c;如果你没有传入一个Comp…...

微知-plantuml常用语法和要点以及模板?(note over、create、box,endbox、alt,else,end, autonumber)

文章目录 常见语法常用 线条类实线虚线斜箭头或奇数箭头 A ->(10) B: B->(10) A分割线&#xff1a;newpage 颜色类给箭头指定颜色 -[#red]->给某个note加颜色&#xff1a; note over Alice, Bob #FFAAAA: xxx给分组信息着色 alt#red 分组类alt xxx; else xxx; else xx…...

gitHub常用操作

gitHub常用操作 1、把项目拉下来2、添加上游仓库3、进入分支4、从上游仓库拉取更新 1、把项目拉下来 在对应项目的右上角点击fork&#xff0c;fork下来&#xff1a;将远程仓库复制到个人仓库 在创建好的分支文件夹下使用 git clone自己远程仓库下的http地址&#xff08;fork…...

Mybatis Plus动态指定数据源

Java开发中一个项目连接多个数据源时&#xff0c;可能会有需要动态指定一个方法所使用的数据源的场景。例如不同的用户查询不同的数据源。 我遇到的需求是这样的&#xff1a;设计一个公共的数据字典组件&#xff0c;该组件需要连接数据源&#xff0c;使用方引入该组件后可以直…...

Python 爬虫 (1)基础 | 基础操作

一、基础操作 1、快速构建一个爬虫 ConvertCurl&#xff1a; https://curlconverter.com/选择URL&#xff0c;点击右键&#xff0c;选择 Copy >> Copy as cURL(bash) 安装JS环境&#xff1a;https://www.jb51.net/python/307069k7q.htm...

C++

目录 C 的发展总结&#xff1a;​编辑 1. C 的早期发展&#xff08;1979-1985&#xff09; 2. C 标准化过程&#xff08;1985-1998&#xff09; 3. C 标准演化&#xff08;2003-2011&#xff09; 4. C11&#xff08;2011年&#xff09; 5. C14&#xff08;2014年&#xf…...

Infineon(英飞凌) TLE985xQX 芯片电机工作电流、电压AD采样

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 单片机芯片合集 文章目录 其他系列文章导航 文章目录 前言 一、选取合适的端口 1.通过 OP1、OP2 电流采集运放输入端口进行H桥驱动的电流采集。 2.通过 O_D_VBAT_AD_EN、I_A_VBAT_A…...

三极管工作原理,以及小电流,如何驱动大电流

因为研究【自动下载电路实现】&#xff0c;涉及到三极管内容&#xff0c;之前看过&#xff0c;现在回看之前的笔记&#xff0c;一点印象都没了&#xff0c;于是&#xff0c;想了个办法&#xff0c;记住它 个人联想&#xff0c;不喜绕道&#xff0c;只是帮助个人记忆的 标题也是…...

Haystack 的开源开发 LLM 应用设计框架

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

彻底理解消息队列的作用及如何选择

一.为什么要使用消息队列&#xff1f; 使用消息队列&#xff0c;其实是需要根据实际业务场景来的&#xff0c;一般都是实际开发中&#xff0c;遇到了某种技术挑战&#xff0c;如果不使用MQ的话&#xff0c;业务实现起来比较麻烦&#xff0c;但是通过MQ就可以更快捷高效的实现业…...

【Java】二叉树:数据海洋中灯塔式结构探秘(上)

个人主页 &#x1f339;&#xff1a;喜欢做梦 二叉树中有一个树&#xff0c;我们可以猜到他和树有关&#xff0c;那我们先了解一下什么是树&#xff0c;在来了解一下二叉树 一&#x1f35d;、树型结构 1&#x1f368;.什么是树型结构&#xff1f; 树是一种非线性的数据结构&…...

海洋通信船舶组网工业4G路由器应用

船舶是浩瀚海洋中探索与贸易的载体&#xff0c;更是船员们生活与工作的家园。为了在广阔的水域中搭建起稳定、高效的网络桥梁&#xff0c;工业4G路由器以卓越的通信组网能力&#xff0c;为船舶组网提供网络支持。 工业4G路由器以其强大的信号发射能力&#xff0c;确保船舶内部…...

字符串-07-判断两个IP是否属于同一子网

文章目录 1. 题目描述2. 思路3. 代码 1. 题目描述 IP地址是由4个0-255之间的整数构成的&#xff0c;用"."符号相连。 二进制的IP地址格式有32位&#xff0c;例如&#xff1a;10000011&#xff0c;01101011&#xff0c;00000011&#xff0c;00011000&#xff1b;每八…...

Django启用国际化支持(2)—实现界面内切换语言:activate()

文章目录 ⭐注意⭐1. 配置项目全局设置&#xff1a;启用国际化2. 编写视图函数3. 配置路由4. 界面演示5、扩展自动识别并切换到当前语言设置语言并保存到Session设置语言并保存到 Cookie ⭐注意⭐ 以下操作依赖于 Django 项目的国际化支持。如果你不清楚如何启用国际化功能&am…...

自定义协议

1. 问题引入 问题&#xff1a;TCP是面向字节流的&#xff08;TCP不关心发送的数据是消息、文件还是其他任何类型的数据。它简单地将所有数据视为一个字节序列&#xff0c;即字节流。这意味着TCP不会对发送的数据进行任何特定的边界划分&#xff0c;它只是确保数据的顺序和完整…...

PHP Date 函数:日期和时间处理的全指南

PHP Date 函数:日期和时间处理的全指南 PHP Date 函数是 PHP 编程语言中用于处理日期和时间的核心函数之一。它提供了强大的功能,允许开发者轻松地格式化、计算和操作日期和时间值。本文将详细介绍 PHP Date 函数的用法,包括基本格式化、时间戳处理、时区设置以及一些高级特…...

C++设计模式:抽象工厂模式(风格切换案例)

抽象工厂模式&#xff08;Abstract Factory&#xff09;是一种创建型设计模式&#xff0c;其核心思想是&#xff1a;为一组相关或相互依赖的对象提供一个创建接口&#xff0c;而无需指定它们具体的类。简单来说&#xff0c;就是一个工厂可以生产一系列相关的对象。 我们接下来…...

社交媒体营销新趋势:如何通过海外平台提升品牌曝光度?

社交媒体不仅是简单的信息传播工具&#xff0c;更是连接用户与品牌之间的重要纽带。每天&#xff0c;有数以亿计的全球用户在不同平台上活跃&#xff0c;潜藏着巨大的市场潜力。对于企业来说&#xff0c;关键在于制定清晰的营销策略&#xff0c;精准把握不同社交平台的特性&…...

嵌入式C/C++编译常见问题与分析

#1 kcx.c:112:89: error: format specifies type unsigned int but the argument has type u32 * (aka unsigned int *) [-Werror,-Wformat] 报错原因&#xff1a; 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…...

知识库搭建:大健康产业数字化转型的新引擎

随着数字经济的蓬勃发展&#xff0c;大健康产业正步入一个崭新的发展篇章。消费者对于健康的追求日益增长&#xff0c;促使大健康企业积极探索数字化路径&#xff0c;以提升供应链效率、控制成本&#xff0c;并在激烈的市场竞争中脱颖而出。在此过程中&#xff0c;一系列数字化…...

创建可重用React组件的实用指南

尽管React是全球最受欢迎和使用最广泛的前端框架之一&#xff0c;但许多开发者在重构代码以提高可复用性时仍然感到困难。如果你发现自己在React应用中不断重复相同的代码片段&#xff0c;那你来对地方了。 在本教程中&#xff0c;将向你介绍三个最常见的特征&#xff0c;表明是…...

蓝桥杯每日真题 - 第18天

题目&#xff1a;&#xff08;出差&#xff09; 题目描述&#xff08;13届 C&C B组E题&#xff09; 解题思路&#xff1a; 问题分析 问题实质是一个带权图的最短路径问题&#xff0c;但路径的权重包含两个部分&#xff1a; 从当前城市到下一个城市的路程时间。 当前城市的…...

MySQL中索引全详解

第一部分&#xff1a;什么是索引 索引在数据库中就像书的目录&#xff0c;能够快速定位数据位置&#xff0c;从而提升查询效率。没有索引时&#xff0c;数据库查询需要从头到尾扫描整个表&#xff08;称为全表扫描&#xff09;&#xff0c;这在数据量大时非常耗时。有了索引后&…...

探索复合物TPP-PEG-Heparin的特性;磷酸三苯酯-聚乙二醇-肝素的线粒体靶向性

TPP-PEG-Heparin&#xff0c;即磷酸三苯酯&#xff08;TPP&#xff09;、聚乙二醇&#xff08;PEG&#xff09;和肝素&#xff08;Heparin&#xff09;的复合物&#xff0c;其特性融合了这三种成分的性质。 一、线粒体靶向性 TPP部分&#xff1a;具有线粒体靶向功能&#xf…...

ubuntu 配置 多个 git 客户端 账户

Git配置两个或多个账户 https://blog.csdn.net/mainking2003/article/details/134711865 git 提交 不用输入用户名、密码的方法&#xff08;GIT免密提交&#xff09; https://blog.csdn.net/wowocpp/article/details/125797263 git config 用法 https://blog.csdn.net/blueb…...

Web3与智能合约:区块链技术下的数字信任体系

随着互联网的不断发展&#xff0c;Web3代表着我们迈入了一个去中心化、更加安全和智能的网络时代。作为Web3的核心组成部分&#xff0c;区块链技术为智能合约的出现和发展提供了强有力的基础。智能合约不仅仅是自动化的代码&#xff0c;它们正逐步成为重塑数字世界信任体系的关…...

RocketMQ文件刷盘机制深度解析与Java模拟实现

引言 在现代分布式系统中&#xff0c;消息队列&#xff08;Message Queue, MQ&#xff09;作为一种重要的中间件&#xff0c;扮演着连接不同服务、实现异步通信和消息解耦的关键角色。Apache RocketMQ作为一款高性能的分布式消息中间件&#xff0c;广泛应用于实时数据流处理、…...

高级编程之结构化代码

背景&#xff1a;以下没结构化代码之前&#xff0c;定时器同步店铺信息的代码。 结构化的思想&#xff1a;SRP&#xff08;单一职责&#xff09;&#xff0c;一个方法是做一件事&#xff0c;层次是相关的&#xff0c;逻辑和数据操作进行拆分&#xff0c;数据操作从业务流程上定…...

学习编程,学习中间件,学习源码的思路

01 看的多&#xff0c;内化不足 最近想复习一下编程相关的知识&#xff0c;在复习前我翻开了之前的一些笔记&#xff0c;这些笔记基本都是从书本、视频、博客等摘取记录的&#xff0c;看着这些笔记心里总结&#xff1a;看的多&#xff0c;内化不足。 02 整理大纲 为了解决这个…...

网络安全与加密

1.Base64简单说明描述&#xff1a;Base64可以成为密码学的基石&#xff0c;非常重要。特点&#xff1a;可以将任意的二进制数据进行Base64编码结果&#xff1a;所有的数据都能被编码为并只用65个字符就能表示的文本文件。65字符&#xff1a;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选择建议 在 开源平台上&#xff0c;开源项目通…...

Java技术复习提升 10异常

10 异常 10.1异常介绍及分类 异常捕获 选中后alttabt->选中try-catch 异常就是程序执行中不正常的情况 注意语法和逻辑错误并不是异常 异常分类有两种 error和exception error是错误 虚拟机无法解决的严重问题 exception是其他因为编程错误或者外在因素导致的一般性的问…...

java版工程项目管理系统源码:Spring Cloud与前后端分离的完美结合

在现代化的工程项目管理中&#xff0c;一套功能全面、操作便捷的系统至关重要。本文将介绍一个基于Spring Cloud和Spring Boot技术的Java版工程项目管理系统&#xff0c;结合Vue和ElementUI实现前后端分离。该系统涵盖了项目管理、合同管理、预警管理、竣工管理、质量管理等多个…...

Oracle与MySQL中CONCAT()函数的使用差异

一、CONCAT函数介绍 CONCAT函数是MySQL等数据库中用于连接两个或多个字符串的内置函数。其基本语法如下&#xff1a; CONCAT(string1, string2, ...)参数说明&#xff1a; string1, string2, …&#xff1a;需要连接的字符串参数&#xff0c;可以有多个。 返回值&#xff1…...

AI社媒引流工具:解锁智能化营销的新未来

在数字化浪潮的推动下&#xff0c;社交媒体成为品牌营销的主战场。然而&#xff0c;面对海量的用户数据和日益复杂的运营需求&#xff0c;传统营销方法显得力不从心。AI社媒引流王应运而生&#xff0c;帮助企业在多平台中精准触达目标用户&#xff0c;提升营销效率和效果。 1.…...

浏览器的事件循环机制

一、请简述浏览器的事件循环机制&#xff08;Event Loop&#xff09;基本原理 浏览器的事件循环机制是用于协调处理 JavaScript 中的异步任务与同步任务执行顺序的一种机制&#xff0c;它确保了代码能够按照合理的顺序执行&#xff0c;避免阻塞页面渲染等情况。其基本原理如下…...

如何在 React 项目中应用 TypeScript?应该注意那些点?结合实际项目示例及代码进行讲解!

在 React 项目中应用 TypeScript 是提升开发效率、增强代码可维护性和可读性的好方法。TypeScript 提供了静态类型检查、自动补全和代码提示等功能&#xff0c;这对于 React 开发者来说&#xff0c;能够帮助早期发现潜在的 bug&#xff0c;提高开发体验。 1. 项目初始化 在现…...

排序算法(五)--归并排序

文章目录 引言归并排序概述C语言实现代码解析结论 归并排序 C语言实例 引言 归并排序&#xff08;Merge Sort&#xff09;作为一种经典的排序算法&#xff0c;以其稳定性、分治法的巧妙应用以及相对高效的时间复杂度而著称。 归并排序概述 归并排序采用分治法&#xff08;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…...

利用开源图床的技巧与实践

随着互联网的普及&#xff0c;图片的使用变得越来越广泛。无论是个人博客、社交媒体还是企业网站&#xff0c;都离不开图片的呈现。而图床作为图片存储和管理的工具&#xff0c;可以帮助开发者和内容创作者高效地管理图片资源。本文将探讨如何利用开源图床&#xff0c;并提供相…...

Unity Lua方向的面试真题详解

最近有位同学面试Unity&#xff0c;面试的公司采用Lua的方案来做公司项目&#xff0c;我们把面试时问道的真题列举出来&#xff0c;并配上参考回复。 1、Lua热更文件时&#xff0c;文件是重写的&#xff0c;还是只写一部分? 热更分为资源更新和代码更新&#xff0c;资源更新…...

经验笔记:Git 基础操作指南

推荐一下Gitee最好的Git操作教程&#xff1a;Learn Git Branching 经验笔记&#xff1a;Git 基础操作指南 1. 安装 Git 首先确保您的计算机上已安装 Git。如果还没有安装&#xff0c;可以从 Git官网 下载并安装。 2. 配置 Git 安装完成后&#xff0c;打开命令行工具&#…...

大模型在智能客服中心领域的应用思考

大模型在智能客服中心领域的应用思考 作者&#xff1a;开源呼叫中心系统 FreeIPCC&#xff0c;Github地址&#xff1a;https://github.com/lihaiya/freeipcc 随着人工智能技术的飞速发展&#xff0c;特别是深度学习技术的突破&#xff0c;大型语言模型&#xff08;LLMs&#x…...

ssm旅游推荐系统的设计与开发

摘 要 旅游推荐系统是一个综合性的在线旅游推荐平台&#xff0c;旨在为用户提供便捷的旅游规划和预定服务。通过该系统&#xff0c;用户能够浏览各类景点信息并进行分类查找&#xff0c;同时获取详尽的景点介绍和相关照片&#xff0c;以辅助做出旅行决策。系统提供在线门票订购…...

C++从零到满绩——入门基础and类和对象(上)

目录 1>>前言 2>>函数重载 3>>引用 3.1>>引用的概念 3.2>>引用三大特性 3.3>>引用的使用 3.4>>const引用 3.5>>指针与引用的关系 4>>inline内联函数 5>>nullptr 6>>类和对象&#xff08;上&#…...