从 LIFO 基础到单调栈模板,12 道题拿下接雨水、柱状图最大矩形两大压轴
栈是面试高频数据结构,单调栈更是「下一个更大/更小」「面积极值」类题目的核心武器。本路径从括号匹配夯实 LIFO 直觉,到字符串解码练习嵌套状态管理,再到每日温度建立单调栈模板,最终用接雨水和柱状图最大矩形完成收口。每道题的 bridge 标注了它复用或打破了哪个前置技巧,帮你建立连贯的技术认知链条。
适合:想吃透栈与单调栈套路的人
核心套路:用栈保存「待匹配/待结算的历史状态」,遇到触发条件就弹栈结算。括号匹配是原型,逆波兰表达式把「操作数先入栈后出栈」练到肌肉记忆,最小栈引入辅助栈同步维护额外信息,字符串解码把嵌套括号拆成逐层压栈——四题串联形成完整的 LIFO 状态机思路。
栈的开山题:左括号入栈,遇右括号弹栈比对,LIFO 天然保证最近未匹配优先——这是后续所有「等待配对」问题的原型模式,先把这个直觉练稳。
上题用栈等待配对,这题用栈缓存操作数:遇数字压栈,遇运算符弹两个操作数计算后再压回——同一 LIFO 模式,从「匹配」换成「延迟计算」。
前两题栈只存一种值,这题引入辅助栈:主栈正常压弹,辅助栈同步维护当前最小值——「双栈同步」是后续需要多维信息时的通用扩展模板。
最小栈双栈思路的直接应用:遇 '[' 把当前字符串和倍数压栈挂起,遇 ']' 弹栈还原拼接——嵌套括号本质是递归,栈把递归状态显式化。
字符串解码练完嵌套状态后,这题用两个栈模拟队列 FIFO,在对比中强化 LIFO 直觉:输入栈满时整体翻转到输出栈,均摊 O(1)——是对栈本质的一次逆向审视。
核心套路:维护一个单调递减栈,新元素入栈前把所有比它小(或等)的元素弹出,弹出时当前新元素就是那些元素的「下一个更大值」——答案在弹栈瞬间产生,而非入栈时产生。这个模板可以直接搬到「下一个更小」「商品折扣」「移掉 K 位数字」等变体,只需改比较方向和结算逻辑。
单调栈第一题:用单调递减栈遍历 nums2,弹栈时记录「谁的下一个更大是当前元素」——这是单调栈最纯粹的模板形式,后续所有变体都是在此基础上改造。
上题求「下一个更大」,这题求「下一个更小或等于」——单调栈方向从递减改递增,弹栈条件取反,验证你是否真的理解了模板而非死记硬背。
两题热身后,这题是单调栈最经典的形式:用递减栈存下标而非值,弹栈时用下标差算出等待天数——「存下标」是从模板到工程实践的关键一步,后续困难题都依赖此技巧。
每日温度存下标求距离,这题把单调栈和贪心结合:维护单调递增栈,遇更小元素弹栈删高位大数字——弹栈从「记录答案」变成「直接构造答案」,思路升维。
核心套路:从「弹栈时记录下一个更大」升级到「弹栈时以弹出元素为基准向左右延伸结算面积」。接雨水以弹出柱为谷底、左右更高柱为边界算横向积水;柱状图以弹出柱高为矩形高度、左右首个更矮柱为宽度边界;最大矩形把每行当柱状图底边,将 84 题直接复用。三题共享一个「弹栈时双向延伸结算」的核心动作,但结算维度不同。