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

深度理解算法和数据结构:栈并非天生存在,而是数组的「思想封装」|4 道经典题从本质吃透栈与单调栈

前言在学习栈、队列这类数据结构时很多人会陷入一个误区把它们当成固定的 API、死记push/pop/top操作。但我最近真正想通了一件事 ——数据结构从来不是先有的结构而是先有的思想。栈并不是什么神奇的黑盒它本质上就是我们对数组进行一套「特殊化、有规则的限制操作」后归纳出来的一种使用方法。只操作数组尾部只允许先进后出不随机访问、不从头遍历用这套规则解决「匹配、嵌套、等待」类问题当这种用法被固定、被封装就成了我们今天说的栈。队列、链表、树全都是如此思想先行结构随后。带着这个本质认知我把栈体系最经典的 4 道题全部打通总结。不讲花活只讲为什么用栈栈解决了什么思想是什么一、栈的本质一句话说透栈 数组 限制规则只操作一端栈顶 数组最后一位先进后出、后进先出不遍历、不回头、不随机访问天然适合最近匹配、保存现场、寻找下一个更大元素你甚至可以不用stack直接用vector模拟栈逻辑一模一样。我们用的从来不是栈这个结构而是它背后的操作思想。二、经典 4 题全归纳思路 思想 代码1. 最小栈 —— 栈基础 空间换时间题目实现能 O (1) 获取最小值的栈。核心思想栈只能操作栈顶不能遍历求最小值。所以用辅助栈同步记录最小值不破坏栈规则。用空间换时间是栈最经典的基础用法。详细思路普通栈的问题如果直接遍历找最小值时间复杂度是 O (n)不符合要求而且栈不应该被遍历。核心突破口我们不能遍历那就提前存好最小值。用两个栈一个正常存数据 stk一个辅助栈 minStk每次 push 时都把当前最小值压进去同步操作数据栈 push最小栈也 push数据栈 pop最小栈也 pop。这样最小栈的栈顶永远是当前栈的最小值。核心思想栈只能操作栈顶不能遍历。用空间换时间在入栈时就记录好最小值保证 O (1) 获取。classMinStack{stackintstk,minStk;public:MinStack(){minStk.push(INT_MAX);}voidpush(intval){stk.push(val);minStk.push(min(val,minStk.top()));}voidpop(){stk.pop();minStk.pop();}inttop(){returnstk.top();}intgetMin(){returnminStk.top();}};2. 有效的括号 —— 最近匹配 栈天生场景题目判断(){}[]是否合法匹配。核心思想谁最后出现谁最先匹配 → 完全符合栈规则。左括号入栈右括号匹配栈顶匹配成功即出栈。逆序处理、就近匹配是栈最直观的用途。详细思路问题本质最近匹配。最后出现的左括号应该最先被匹配。栈的天生优势后进先出。遍历字符串遇到左括号把对应的右括号压入栈遇到右括号检查是否和栈顶相同不同 / 栈空 → 不匹配相同 → 弹出栈顶最后栈空 完全匹配。核心思想谁最后进来谁最先匹配 → 栈就是为这种问题而生。boolisValid(string s){stackcharst;for(charc:s){if(c()st.push());elseif(c{)st.push(});elseif(c[)st.push(]);else{if(st.empty()||st.top()!c)returnfalse;st.pop();}}returnst.empty();}3. 字符串解码 —— 嵌套 保存现场题目解码3[a]2[bc] → aaabcbc。核心思想遇到[需要保存当前状态数字 字符串遇到]需要恢复现场拼接结果。栈 天然断点存储器所有嵌套问题首选栈。详细思路问题难点嵌套结构。遇到 [ 要暂停当前工作进入内层遇到 ] 要回到之前的状态。栈 天然现场保存器。需要保存两个状态数字倍数当前拼接好的字符串两个栈numStk存倍数strStk存之前的字符串遍历规则数字累计计算[保存现场 → 数字和字符串入栈清空当前变量]恢复现场 → 出栈拼接字符串 之前字符串 当前字符串 × 次数字母直接拼接核心思想嵌套问题 保存现场 恢复现场 → 栈最擅长。stringdecodeString(string s){stackstringstrStk;stackintnumStk;string curStr;intcurNum0;for(chark:s){if(isdigit(k)){curNumcurNum*10(k-0);}elseif(k[){numStk.push(curNum);curNum0;strStk.push(curStr);curStr.clear();}elseif(k]){intcntnumStk.top();numStk.pop();string prevstrStk.top();strStk.pop();string temp;for(inti0;icnt;i)tempcurStr;curStrprevtemp;}else{curStrk;}}returncurStr;}4. 每日温度 —— 单调栈寻找下一个更大元素题目寻找下一个更高温度等待几天核心思想暴力 O (n²) 太慢。用栈保存还没找到答案的下标遇到更大值批量出栈。每个元素只入栈、出栈一次 → O (n) 最优解。栈在这里 等待队列。详细思路暴力解法两层循环对每个数往后遍历找更大值 → O (n²)超时。优化目标一次遍历 O (n)。核心思想用栈保存还没找到答案的下标。栈中存下标不存温度。遍历逻辑当前温度 栈顶温度→ 栈顶找到了答案→ 计算天数差i - 栈顶下标→ 弹出栈顶→ 继续检查新栈顶while 循环直到不能再处理把当前下标压入栈等待未来处理栈始终保持单调递减栈顶最小。核心思想栈 等待队列。每个元素只入栈、出栈一次时间复杂度 O (n)vectorintdailyTemperatures(vectorinttemp){intntemp.size();vectorintres(n,0);stackintst;for(inti0;in;i){while(!st.empty()temp[i]temp[st.top()]){intprest.top();st.pop();res[pre]i-pre;}st.push(i);}returnres;}三、贯穿所有题的核心思维真正的干货不要死记结构要理解思想栈 限制操作的数组你用 vector 也能写。什么时候用栈最近匹配嵌套、层级保存现场 / 断点寻找下一个更大 / 更小单调栈栈永远遵守三不原则不遍历不回头不随机访问只操作栈顶这就是它快、简洁、强大的原因。四、总结通透** 算法是解决问题的思路数据结构是思路的固定化、封装化。栈、队列、链表、树都只是对数组与内存的「一套使用规则」。你理解了思想就不再被工具束缚你看透了本质所有题目都是同一种思维。**尾言这篇博客是我学习栈的真实顿悟。从死记 API到理解 “数组特殊操作 栈”整个思路瞬间打通。希望能帮到同样在学习数据结构的你。真正的高手都在看本质。

相关文章:

深度理解算法和数据结构:栈并非天生存在,而是数组的「思想封装」|4 道经典题从本质吃透栈与单调栈

前言 在学习栈、队列这类数据结构时,很多人会陷入一个误区:把它们当成固定的 API、死记push/pop/top操作。 但我最近真正想通了一件事 ——数据结构从来不是先有的结构,而是先有的思想。栈并不是什么神奇的黑盒,它本质上就是&…...

WinCDEmu:开源虚拟光驱工具的技术架构与实践指南

WinCDEmu:开源虚拟光驱工具的技术架构与实践指南 【免费下载链接】WinCDEmu 项目地址: https://gitcode.com/gh_mirrors/wi/WinCDEmu 副标题:5个核心优势让你高效管理光盘映像文件 一、核心价值解析 WinCDEmu作为一款开源虚拟光驱解决方案&…...

20260408 硬盘分区管理

一、硬盘分区管理 大容量的硬盘,分区使用:C盘系统盘,D盘办公,E盘娱乐。 1.1 识别硬盘设备接口类型设备命名示例说明SATA/SAS/USB/SCSI/dev/sda、/dev/sdb …物理机常用的磁盘设备命名virtio-blk(虚拟机)/de…...

实测H3C s5500-52C-SI 交换机破解密码

1.使SecureCRT连接上交换机;2.重新启动交换机,启动阶段一直按Ctrlb键,直到显示“press ctrl-b to enter boot menu”和“password:”界面时按enter,如下图:3.交换机显示boot menu界面,有10个选项…...

写段代码教会你什么是HOOK技术?HOOK技术能干什么?肯

为 HagiCode 添加 GitHub Pages 自动部署支持 本项目早期代号为 PCode,现已正式更名为 HagiCode。本文记录了如何为项目引入自动化静态站点部署能力,让内容发布像喝水一样简单。 背景/引言 在 HagiCode 的开发过程中,我们遇到了一个很现实的问…...

STM32 串口通信入门:printf 重定向 + 调试技巧

作为STM32新手,串口通信是嵌入式调试的万能钥匙。很多新手调试程序时,只能靠LED亮灭判断运行状态,出错后无从排查;想查看变量、确认函数执行情况,也没有有效方法。串口通信可解决这一问题,通过printf函数&a…...

Windows安卓应用安装新方案:APK-Installer极简指南

Windows安卓应用安装新方案:APK-Installer极简指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 在Windows系统上运行安卓应用一直是许多用户的痛点。传统…...

QTableWidget 表格组件熬

7.1 初识三维模型 7.1.1 三维模型的数据载体 随着计算机图形技术的发展,我们或多或少都会见过或者听说过三维模型。笔者始终记得小时候第一次在电视上看到三维动画《变形金刚:超能勇士》的震撼感受;而现在我们已经可以在手机上玩三维游戏《王…...

Gemini api网络超时问题求助

用codex连接的gemini api,没想到一用就超时,是梯子问题吗?以及上面这些models哪个更能全面解决coding问题,也很少出错...

AdvancedSessionsPlugin技术深度解析:虚幻引擎分布式会话管理解决方案

AdvancedSessionsPlugin技术深度解析:虚幻引擎分布式会话管理解决方案 【免费下载链接】AdvancedSessionsPlugin Advanced Sessions Plugin for UE4 项目地址: https://gitcode.com/gh_mirrors/ad/AdvancedSessionsPlugin 在虚幻引擎多玩家游戏开发中&#x…...

VMware macOS解锁终极实战指南:5步让Windows/Linux完美运行苹果系统

VMware macOS解锁终极实战指南:5步让Windows/Linux完美运行苹果系统 【免费下载链接】unlocker VMware Workstation macOS 项目地址: https://gitcode.com/gh_mirrors/unloc/unlocker 在虚拟化技术日益普及的今天,许多开发者和技术爱好者都希望能…...

lvgl-micropython、lv_micropython和lv_binding_micropython到底啥关系?一文读懂汕

一、背景与问题缘起 MySQL 5.6.51 版本下 2000 万行核心业务表开展新增字段操作,需求为新增BIGINT(19) NOT NULL DEFAULT 0 COMMENT 注释(因业务实际需要存储大数值关联字段)。 表的核心特性为Java 多线程密集读写,业务请求持续高…...

AI Coding越来越强,我们还有必要学Processing吗? · 创意编程运

故障表现 发现请求集群 demo 入口时卡住,并且对应 Pod 没有新的日志输出 rootce-demo-1:~# kubectl get pods -n deepflow-otel-spring-demo -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NO…...

别再踩坑了!SQL Server数据类型那点事儿,看懂这篇少背三个锅厣

从0构建WAV文件:读懂计算机文件的本质 虽然接触计算机有一段时间了,但是我的视野一直局限于一个较小的范围之内,往往只能看到于算法竞赛相关的内容,计算机各种文件在我看来十分复杂,认为构建他们并能达到目的是一件困难…...

像素剧本圣殿详细步骤:基于Qwen2.5-14B-Instruct的剧本张力增强微调方法

像素剧本圣殿详细步骤:基于Qwen2.5-14B-Instruct的剧本张力增强微调方法 1. 项目概述 像素剧本圣殿(Pixel Script Temple)是一款专为剧本创作设计的AI辅助工具,基于Qwen2.5-14B-Instruct大模型深度微调而成。这个工具将先进的自然语言处理技术与复古像…...

MedGemma应用案例:如何用药企医学影像标注辅助系统提升研究效率?

MedGemma应用案例:如何用药企医学影像标注辅助系统提升研究效率? 1. 医学影像标注的行业痛点 在药物研发和医学研究中,医学影像标注是一项基础但极其耗时的工作。传统标注流程面临三大核心挑战: 人工成本高:需要专业…...

cv_resnet50_face-reconstruction效果可视化:热力图分析重建误差分布与关键面部区域精度

cv_resnet50_face-reconstruction效果可视化:热力图分析重建误差分布与关键面部区域精度 你是不是也好奇,一个人脸重建模型到底“重建”得怎么样?它能把你的五官还原得一模一样吗?眼睛、鼻子、嘴巴这些关键部位,哪个重…...

Graphormer在嵌入式边缘计算设备的轻量化部署研究

Graphormer在嵌入式边缘计算设备的轻量化部署研究 1. 边缘计算中的图神经网络应用场景 在医疗诊断、材料研发和药物发现等领域,分子特性分析是一个关键环节。传统方法依赖实验室测试和计算模拟,不仅成本高昂,而且耗时漫长。Graphormer这类图…...

编写程序让智能文具收纳盒检测物品缺失,常用笔不在时提示“寻找放回”。

项目名称:PenPal Guardian (智能文具收纳盒)一、 实际应用场景描述场景设定为一个带有重量感应和RFID识别功能的智能文具收纳盒。在这个场景中,收纳盒被放置在办公桌的固定位置。盒子里预先放置了“必备三件套”:一支签字笔、一支铅笔、一把尺…...

性价比高的佛山市办公家具工程哪家技术强

行业痛点分析当前,佛山市办公家具工程领域面临诸多技术挑战。在设计方面,普通办公桌造型老旧,难以满足现代企业对品牌形象与办公空间美学的需求,数据表明,超60%的企业认为现有办公家具档次不够,无法体现企业…...

Blazor Hybrid跨端失控?揭秘WinUI3/MacCatalyst/iOS 18原生桥接的3种反模式与1套工业级Bridge Protocol设计规范

第一章:Blazor Hybrid跨端失控的本质与2026技术拐点研判Blazor Hybrid 的“跨端失控”并非架构缺陷,而是其运行时契约在多宿主环境(WebView2、Android WebView、iOS WKWebView)中持续弱化的必然结果。当 .NET MAUI 或 Avalonia 作…...

DDD难落地?就让AI干吧! - cleanddd-skills介绍衔

AI训练存储选型的演进路线 第一阶段:单机直连时代 早期的深度学习数据集较小,模型训练通常在单台服务器或单张GPU卡上完成。此时直接将数据存储在训练机器的本地NVMe SSD/HDD上。 其优势在于IO延迟最低,吞吐量极高,也就是“数据离…...

编写程序让智能鱼缸换水提醒,水质指标超标提示“及时换水”。

项目名称:Aquarium Guardian (智能鱼缸管家)一、 实际应用场景描述在一个典型的家庭或办公室观赏鱼缸场景中,鱼友(用户)通常依赖经验或日历提醒来进行换水。然而,鱼缸的水质受多种因素影响:* 生物因素&…...

DeepSpeed 学习指南

DeepSpeed 代码库学习指南 适合希望深入理解 DeepSpeed 内部机制的工程师与研究者。 目录 项目定位与核心价值整体架构分层目录结构详解核心模块深度导览 4.1 入口与初始化4.2 DeepSpeedEngine — 训练引擎4.3 ZeRO — 显存优化系列4.4 混合精度优化器4.5 流水线并行4.6 序列并…...

FlicFlac:开源音频转换工具从原理到实践

FlicFlac:开源音频转换工具从原理到实践 【免费下载链接】FlicFlac Tiny portable audio converter for Windows (WAV FLAC MP3 OGG APE M4A AAC) 项目地址: https://gitcode.com/gh_mirrors/fl/FlicFlac 在数字音频处理领域,格式转换是连接不同…...

【PHP大文件处理避坑红宝书】:基于17个真实生产事故总结的8条黄金铁律

第一章:PHP大文件处理的核心挑战与认知误区在Web应用中处理GB级日志、视频元数据或批量导出报表时,开发者常误将 file_get_contents() 或 $_FILES[upload][tmp_name] 直接用于大文件操作,导致内存耗尽、超时中断或服务不可用。这些实践暴露了…...

“羽绒服面料哪家好?”这 5 家源头工厂值得加入采购清单

在 2026 年的服装消费大环境中,品牌的供应链抗压能力正面临前所未有的考验。随着气候变化与消费趋势的急速迭代,品牌方对于核心材料的需求,已经从单纯的“低价采购”彻底转变为“确定性交付”。对于采购主理人与供应链总监而言,评…...

如何使用HS2-HF_Patch优化Honey Select 2游戏体验:完整指南

如何使用HS2-HF_Patch优化Honey Select 2游戏体验:完整指南 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch HS2-HF_Patch是一款专为《Honey Select …...

如何提高邮件营销的投资回报率

在与大量客户的长期沟通中,我发现一个非常有趣的现象,即大家对邮件营销的投资回报率出现了两极分化的评价:一部分企业认为邮件营销的效果非常一般,发着发着就不发了;而另一部分企业认为,邮件营销的投资回报…...

LAYONTHEGROUND筛

一、什么是requests? requests 是一个用于发送HTTP请求的 Python 库。 它可以帮助你: 轻松发送GET、POST、PUT、DELETE等请求 处理Cookie、会话等复杂性 自动解压缩内容 处理国际化域名和URL 二、应用场景 requests 广泛应用于以下实际场景: …...