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

C++实战笔记(2): 栈

1. 基础知识栈Stack是一种非常经典的线性数据结构它最核心的特点是后进先出Last In First Out, LIFO。也就是说最后进入栈的元素会最先被取出而最早进入的数据反而要等到上面的元素全部弹出后才能访问。这个规律非常符合现实中的很多场景比如一摞叠起来的书最后放上去的书一定最先拿走。在 C 中标准库直接提供了stack容器适配器本质上它不是一个独立实现的底层容器而是对已有线性容器默认deque进行了一层“只允许栈式操作”的封装。也就是说你不能像vector一样随机访问中间元素只能对栈顶进行操作这也是它能天然保证“后进先出”的根本原因。#include stack using namespace std; stackint st;这里的stackint表示定义一个整型栈后续所有操作都围绕栈顶展开。对于栈来说真正需要重点掌握的是几个高频接口push()表示入栈pop()表示出栈top()用于访问栈顶元素empty()判断是否为空size()获取当前元素数量。2. 代码实战2.1. 力扣20题有效的括号给定一个只包括(){}[]的字符串s判断字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。解题思路核心思想就是利用栈的后进先出特性来处理“最近未匹配左括号”。因为括号是否合法本质上要求每一个右括号都必须和它前面最近出现的同类型左括号匹配。这和栈顶元素的访问方式天然一致所以栈是最优数据结构。解题做法从左到右遍历字符串遇到左括号就直接入栈因为它暂时还没有找到匹配对象如果遇到右括号就说明要开始匹配此时必须检查当前栈顶是否是对应类型的左括号。为了提高匹配效率我们再额外使用一个哈希表建立) - ( } - { ] - [这样的映射关系这样每次遇到右括号时都能O(1)判断应该匹配什么左括号。那综上所述整个解题流程可以总结为三个步骤首先遍历字符串其次判断当前字符是不是右括号如果是就检查栈顶是否匹配若是左括号直接入栈最后遍历结束后只要栈为空就说明所有括号全部成功配对完整代码#include stack // 栈用于保存左括号 #include string // 字符串处理 #include unordered_map // 哈希表建立括号映射关系 using namespace std; class Solution { public: bool isValid(string s) { //定义一个字符栈用于存放左括号 stackchar brackerStack; //定义右括号到左括号的映射关系,其中key为右括号value为对应的左括号 unordered_mapchar,char brackerMap { {), (}, {}, {}, {], [} }; //遍历字符串中的每个字符 for (char c : s) { //如果是右括号遍历哈希表中的key找对应值如果是左括号是找不到值的 if(brackerMap.find(c) ! brackerMap.end()) { //情况1栈为空说明没有左括号可以匹配 if(brackerStack.empty()){ return false; } //情况2栈顶元素与当前右括号对应的左括号不匹配 if(brackerStack.top() ! brackerMap[c]) { return false; } //情况3匹配成功弹出栈顶元素 brackerStack.pop(); }else{ //如果是左括号直接入栈 brackerStack.push(c); } } return brackerStack.empty(); //如果栈为空说明所有括号都匹配成功 } };2.2. 力扣394字符串解码给定一个经过编码的字符串返回它解码后的字符串。编码规则为:k[encoded_string]表示其中方括号内部的encoded_string正好重复k次。注意k保证为正整数。你可以认为输入字符串总是有效的输入字符串中没有额外的空格且输入的方括号总是符合格式要求的。此外你可以认为原始数据不包含数字所有的数字只表示重复的次数k例如不会出现像3a或2[4]的输入。测试用例保证输出的长度不会超过105。解题思路整体思路可以概括为从左到右遍历字符串用一个整数num记录当前重复次数用一个字符串currentStr记录当前层已经解析出的结果当遇到数字时持续累积位数解决12[a]这种多位数字情况当遇到左括号[时说明要进入新的一层嵌套此时需要把当前次数和当前字符串同时入栈保存现场然后清空开始处理括号内部内容当遇到右括号]时说明当前层解析结束此时弹出上一层保存的状态将当前字符串重复指定次数后拼接回去如果是普通字母则直接追加到当前字符串末尾。解题步骤左括号保存现场右括号恢复现场并展开字符串完整代码#include stack #include string #include cctype using namespace std; class Solution { public: string decodeString(string s) { // 数字栈保存每一层括号前的重复次数 stackint numStack; // 字符串栈保存进入括号前上一层已经构造好的字符串 stackstring strStack; int num 0; // 当前解析到的数字 string currentStr ; // 当前层正在构造的字符串 // 遍历整个输入字符串,根据不同字符进行处理 for (char c : s) { // 如果是数字累积重复次数处理多位数 if (isdigit(c)) { num num * 10 (c - 0); } // 遇到左括号保存当前状态 else if (c [) { numStack.push(num); // 保存重复次数 strStack.push(currentStr); // 保存上一层字符串 // 进入新层清空当前状态 num 0; currentStr ; } // 遇到右括号开始展开当前层字符串 else if (c ]) { int repeatTimes numStack.top(); numStack.pop(); string previousStr strStack.top(); strStack.pop(); // 当前层字符串重复 repeatTimes 次 string temp ; for (int i 0; i repeatTimes; i) { temp currentStr; } // 拼接回上一层 currentStr previousStr temp; } // 普通字符直接加入当前字符串 else { currentStr c; } } return currentStr; } };2.3. 力扣739每日温度给定一个整数数组temperatures表示每天的温度返回一个数组answer其中answer[i]是指对于第i天下一个更高温度出现在几天后。如果气温在这之后都不会升高请在该位置用0来代替。解题思路整个过程的核心可以总结成一句话栈中保存还没找到更高温度的下标一旦当前温度更高就替栈顶那一天结算答案。完整代码#include vector #include stack using namespace std; class Solution { public: vectorint dailyTemperatures(vectorint temperatures) { // 获取温度数组长度 int n temperatures.size(); // 定义结果数组初始化全部我呢0 // 如果某一天后面没有更高的温度就保持为0 vectorint answer(n,0); //定义一个栈用来存放还没有找到更高温度的下标 stackint s; // 遍历每天温度 for (int i 0; i n; i){ while (!s.empty() temperatures[i] temperatures[s.top()]) { // 取出栈顶下标 int topIndex s.top(); s.pop(); // 计算等待天数当前下标 - 栈顶下标 answer[topIndex] i - topIndex; } // 当前下标入栈表示它暂时还没找到更高温度 s.push(i); } //返回结果数组 return answer; } };2.4. 力扣155最小栈设计一个支持pushpoptop操作并能在常数时间内检索到最小元素的栈。实现MinStack类:MinStack()初始化堆栈对象。void push(int val)将元素val推入堆栈。void pop()删除堆栈顶部的元素。int top()获取堆栈顶部的元素。int getMin()获取堆栈中的最小元素解题思路这道题最关键的要求不是普通的push / pop / top而是新增了一个getMin()要在 O(1) 时间返回当前最小值。如果每次调用getMin()都去遍历整个栈时间复杂度就是 O(n)O(n)O(n)显然不符合题目要求。因此这题的核心思想就是使用两个栈同步维护。其中一个主栈dataStack正常存储所有元素另一个辅助栈minStack专门存储“当前阶段的最小值”。解题步骤每次push(val)时主栈一定直接入栈而辅助栈只在以下两种情况入栈辅助栈为空当前元素小于等于辅助栈栈顶最小值这样就能保证辅助栈的栈顶永远是当前所有元素中的最小值。当执行pop()时如果主栈弹出的元素刚好等于当前最小值那么辅助栈也必须同步弹出这样新的最小值就自然变成辅助栈新的栈顶。完整代码#include stack using namespace std; class Minstack { private: //主栈正常存储所有元素 stackint datastack; //辅助栈存储当前最小元素 stackint minstack; public: //构造函数 Minstack(){ } //入栈,如果辅助栈为空或者当前值小于等于当前最小值就同步压入辅助栈 void push(int x) { datastack.push(x); if (minstack.empty() || x minstack.top()) { minstack.push(x); } } // 出栈 void pop() { if (!datastack.empty()) { if (datastack.top() minstack.top()) { minstack.pop(); } datastack.pop(); } } // 获取栈顶元素 int top() { return datastack.top(); } // 获取当前最小值 int getMin() { return minstack.top(); } };

相关文章:

C++实战笔记(2): 栈

1. 基础知识 栈(Stack)是一种非常经典的线性数据结构,它最核心的特点是 后进先出(Last In First Out, LIFO)。也就是说,最后进入栈的元素,会最先被取出;而最早进入的数据&#x…...

实测AI人脸隐私卫士:远距离小脸也能精准识别并打码

实测AI人脸隐私卫士:远距离小脸也能精准识别并打码 关键词:AI人脸检测、隐私保护、MediaPipe、自动打码、图像脱敏、本地离线处理、远距离识别 1. 背景与需求分析 1.1 远距离人脸识别的技术挑战 在集体活动拍摄、监控安防等场景中,人脸识…...

Pixel Couplet Gen 算法解析:LSTM网络在序列文本生成中的应用

Pixel Couplet Gen 算法解析:LSTM网络在序列文本生成中的应用 1. 传统对联遇上现代AI 春节贴对联是中国延续千年的文化传统,一副好对联讲究平仄相对、对仗工整、意境相合。传统上,这需要深厚的文学功底才能创作。而今天,Pixel C…...

告别环境冲突!用Docker在Ubuntu 22.04上5分钟搞定ROS2 Humble和rviz2

容器化ROS2开发实战:Ubuntu 22.04Docker高效环境搭建指南 在机器人操作系统(ROS)开发中,环境配置一直是开发者面临的棘手问题。不同ROS版本间的依赖冲突、系统库版本不兼容、开发环境污染等问题常常让开发者陷入无休止的调试循环。…...

U9C与钉钉集成,选‘谁发起’很重要!从系统设计角度聊聊两种对接方案的优劣与选型建议

U9C与钉钉集成:从系统设计视角解析发起方选择的关键逻辑 当企业资源计划(ERP)系统与协同办公平台需要深度整合时,"谁作为数据发起方"这个看似简单的决策,往往成为影响整个系统稳定性的关键因素。作为经历过多…...

OpenCASCADE法向获取避坑指南:为什么你的法线方向总是不对?

OpenCASCADE法向获取避坑指南:为什么你的法线方向总是不对? 在三维建模领域,法线方向的重要性不言而喻。它不仅影响着光照计算、碰撞检测等基础功能,更直接关系到后续的有限元分析、数控加工等高级应用的准确性。作为一款开源的几…...

基于海康SDK+YOLOv8n-pose的智能监控开发:如何用Python实现跌倒检测报警系统

基于海康SDK与YOLOv8n-pose的智能跌倒检测系统开发实战 在养老院、医院病房等特殊场所,跌倒事件往往意味着高风险。传统监控系统只能被动记录画面,而结合计算机视觉的智能分析技术,我们可以实现主动预警。本文将手把手教你如何用Python整合海…...

多模态家居系统崩溃频发?3类隐性跨模态对齐失效正在吞噬你的AIoT稳定性

第一章:多模态家居系统崩溃频发的奇点警讯 2026奇点智能技术大会(https://ml-summit.org) 当语音指令未被响应、视觉传感器突然黑屏、温控模块在零下15℃自动切换至制冷模式——这些并非孤立故障,而是多模态家居系统在跨模态语义对齐失效后集体退化的表…...

【仅限本届参会者解密】:SITS2026圆桌闭门纪要流出——多模态→AGI的3个非线性跃迁窗口期(含时间坐标)

第一章:SITS2026圆桌:多模态与AGI路径 2026奇点智能技术大会(https://ml-summit.org) 在SITS2026圆桌讨论中,来自DeepMind、OpenAI、中科院自动化所及斯坦福HAI的七位研究者围绕“多模态表征统一性”与“AGI涌现临界条件”展开深度交锋。核…...

BetterGI:5大核心功能彻底解放你的原神双手![特殊字符]

BetterGI:5大核心功能彻底解放你的原神双手!🎮 【免费下载链接】better-genshin-impact 📦BetterGI 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动刷本 | 自动采集/挖矿/锄地 | 一条龙…...

2026年3月亲测:GEO优化厂家实操分享

行业痛点分析在AI搜索流量占比超65%的2026年,全国GEO优化领域正面临三大核心挑战:地域精准度不足导致无效流量占比高达38%(数据来源:中国互联网协会2026年Q1报告),平台适配滞后使企业错失72%的算法更新红利…...

【AI入门系列】车市先知:二手车价格预测学习赛507

深度学习方案...

技术书籍速读:年度Top 5推荐

——软件测试从业者的专业进阶指南在AI与云原生技术深度重塑软件测试行业的2026年,高效阅读技术书籍已成为测试工程师的核心竞争力。面对自动化测试框架的快速迭代、DevSecOps的全面普及以及AI测试工具的爆发式增长,测试从业者亟需通过科学速读掌握前沿知…...

优化EFI引导配置:实现WIN10与UBUNTU20.04双系统无缝切换

1. 双系统引导的痛点与EFI解决方案 每次开机都要狂按F12选择系统?两个系统互相找不到对方?删除一个系统导致另一个也无法启动?这些困扰我多年的双系统问题,终于在一次重装系统时找到了完美解决方案。传统BIOSMBR的方式确实可以实现…...

RK3588 AI开发选型指南:RKNN-Toolkit-Lite2 vs. RKNPU2 SDK,C接口和Python接口到底怎么选?

RK3588 AI开发选型指南:RKNN-Toolkit-Lite2与RKNPU2 SDK深度对比 当项目进入部署阶段,RK3588开发者常面临一个关键抉择:选择Python生态的RKNN-Toolkit-Lite2还是C语言的RKNPU2 SDK?这个选择直接影响开发效率、运行性能和后期维护成…...

测试左移与右移平衡:工作流优化

在快速迭代的软件交付环境中,测试左移(Shift-Left Testing)和测试右移(Shift-Right Testing)已成为提升质量与效率的核心策略。测试左移强调在开发生命周期早期介入测试,而测试右移聚焦于生产环境的持续验证…...

C# winform 自制分页功能

一个精简的分页类&#xff0c;配合现有的界面按钮使用&#xff1a;分页类&#xff08;Pagination.cs&#xff09; using System; using System.Collections.Generic;/// <summary> /// 分页管理类 /// </summary> public class Pagination {private int _pageIndex…...

STM32上FreeRTOS和LVGL一起跑,显示不出来?试试这两个配置(附CubeMX工程)

STM32上FreeRTOS与LVGL整合实战&#xff1a;从黑屏到流畅显示的配置秘籍 第一次在STM32上同时跑FreeRTOS和LVGL的经历&#xff0c;就像试图让两个固执的舞者配合跳探戈——明明各自都跳得很好&#xff0c;凑在一起却总是踩脚。我盯着那块毫无反应的LCD屏幕&#xff0c;仿佛能听…...

零基础用AI建站工具:10分钟从注册到网站上线的极速实操教程

痛点共情&#xff1a;代码恐惧症&#xff1f;别怕&#xff0c;现在建站只需要会“说话”你是不是觉得建网站是程序员的事&#xff0c;自己完全是个门外汉&#xff1f;看着那些复杂的后台、代码和术语&#xff0c;头都大了。心里想建个官网&#xff0c;却因为不懂技术&#xff0…...

Fish Speech 1.5行业方案:文旅景区多语种智能导览语音生成实践

Fish Speech 1.5行业方案&#xff1a;文旅景区多语种智能导览语音生成实践 1. 项目背景与需求分析 文旅景区面临着多语种导览的普遍痛点。传统人工录制多语言导览语音成本高昂&#xff0c;一个小型景区需要中英日韩四种语言的导览&#xff0c;仅录制费用就可能达到数万元。而…...

Go语言怎么做并发安全设计_Go语言并发安全编程教程【必备】

是否加互斥锁取决于结构体是否被多个goroutine并发读写&#xff1b;只读无需锁&#xff0c;含可变字段&#xff08;如map、slice、指针&#xff09;且会被修改则必须加锁&#xff08;Mutex或RWMutex&#xff09;&#xff0c;sync.Once不提供后续访问保护。怎么判断一个结构体是…...

第 7 课:FAB 安全规范与 EPC/ESD 基础

第 7 课&#xff1a;FAB 安全规范与 EPC/ESD 基础 一、本课学习目标 了解 FAB 现场安全基本规则&#xff0c;不违规、不添乱 理解 ESD 静电防护对机台与 EAP 工作的意义 搞懂 EPC 基础概念&#xff0c;知道 EAP 在其中的作用 建立 “安全第一、联锁不能随便短接” 的职业意识 二…...

2026 前端大清洗:80% 初级岗已被 AI 团灭,但这 3 类人薪资暴涨 70%!

警告&#xff1a;这篇文章可能会让你焦虑&#xff0c;但绝对能救你的职业生涯。2026 年第一季度&#xff0c;国内互联网公司前端招聘量同比暴跌 62%&#xff0c;但同时有 3 类前端岗位薪资逆势上涨 70% 以上。AI 不是在淘汰前端&#xff0c;而是在淘汰不会用 AI 的前端。本文将…...

云原生存储架构实践

云原生存储架构实践 1. 云原生存储架构的概念与价值 云原生存储架构是专为云环境设计的存储解决方案&#xff0c;具有弹性、可扩展、高可用等特性。随着容器化和微服务架构的普及&#xff0c;云原生存储已成为企业数据管理的重要组成部分。通过采用云原生存储架构&#xff0c;企…...

如何用Universal x86 Tuning Utility终极解决笔记本高温降频问题

如何用Universal x86 Tuning Utility终极解决笔记本高温降频问题 【免费下载链接】Universal-x86-Tuning-Utility Unlock the full potential of your Intel/AMD based device. 项目地址: https://gitcode.com/gh_mirrors/un/Universal-x86-Tuning-Utility 还在为笔记本…...

从门电路到计数器:基于Libero的Verilog数字系统核心模块实战

1. 数字逻辑的基石&#xff1a;从门电路开始 第一次接触Verilog时&#xff0c;我被那些看似简单的门电路震撼到了。谁能想到&#xff0c;现代计算机的复杂运算&#xff0c;竟然都建立在与、或、非这些基础逻辑之上&#xff1f;在Libero软件中实现这些门电路&#xff0c;就像在搭…...

别再纠结YOLOv8模型了!一张图看懂n/s/m/l/x怎么选(附数据集大小对照表)

YOLOv8模型选择实战指南&#xff1a;从数据集到硬件的全维度决策 站在计算机视觉项目开发的十字路口&#xff0c;面对YOLOv8提供的五个不同规模的模型&#xff08;n/s/m/l/x&#xff09;&#xff0c;许多开发者常陷入选择困难。这就像在装备店挑选登山装备——短途郊游没必要背…...

从‘看哪里’到‘不看哪里’:聊聊CV中的反向注意力(Reverse Attention)与人类的视觉注意机制

从视觉盲点到算法突破&#xff1a;反向注意力如何重塑计算机视觉的观察逻辑 1. 人类视觉的"选择性失明"与机器视觉的困境 站在拥挤的地铁站台寻找穿红色外套的朋友时&#xff0c;我们的大脑会自动屏蔽数以百计的灰色西装——这种神奇的"视觉过滤"能力&…...

发那科机器人Modbus通讯配置全攻略:从IP设置到信号调试

1. 发那科机器人Modbus通讯基础认知 第一次接触发那科机器人的Modbus通讯时&#xff0c;我也被各种专业术语搞得一头雾水。简单来说&#xff0c;Modbus就像机器人和其他设备&#xff08;比如PLC&#xff09;之间的一种"语言"&#xff0c;而我们要做的就是教会机器人说…...

GLM-4.1V-9B-Base从零部署:Ubuntu服务器环境配置详解

GLM-4.1V-9B-Base从零部署&#xff1a;Ubuntu服务器环境配置详解 1. 准备工作与环境检查 在开始部署GLM-4.1V-9B-Base之前&#xff0c;我们需要确保服务器环境满足基本要求。这个步骤就像盖房子前要检查地基是否牢固一样重要。 首先确认你的Ubuntu服务器版本。GLM-4.1V-9B-B…...