单调栈动画演示

栈里保持单调,来了更大的就把憋着的一次次结算掉。

键盘:← → 单步 ·空格 播放/暂停 · R 重置 ·Home/End 到两端

单调栈把「还不知道答案的元素」暂存在栈里,栈内元素对应的值始终保持单调。来了一个能打破单调的新元素,就把栈顶憋着的一个个弹出结算:它等的答案恰好就是眼前这个元素。舞台中间那一竖排是栈,格子里写下标、次级说明写它对应的值;最下面那排是结果数组,每次结算都会当场写上「由第几位定下来」,扫完还能看见哪些位置一直是无解。

三档题面只差在「破单调的条件」和「结算写什么」。下一个更大元素用栈顶值小于当前值来判,结果写右边的更大值;每日温度同一个判断,结果写成下标之差;柱状图最大矩形把方向调过来——栈内高度不降,来了一根更矮的才弹出结算,结果写这根柱子能撑多宽,宽度取 i 减新栈顶再减一,面积才是要求最大的量。

单调栈演示怎么用

  • 换题面:三档依次是下一个更大元素、每日温度、柱状图最大矩形;前两档看结果数组,第三档看最末一步框住的区间。
  • 数两个计数:压栈与弹出结算并排显示,两者各自不超过 n 次。这就是「看着像双重循环、其实摊下来线性」的直接证据。
  • 看哨兵:柱状图那档在扫描结束时会补一个高度 0 的虚拟右端,把栈里剩的柱子全部结算掉,最大矩形才不会被留在没算过的状态里。
  • 自定义数据:自定义栏填数字(空格或逗号分隔,上限 12 个)。柱子高度全相同时会看到等值不触发弹出,宽度靠末尾那根统一结算。

常见问题

栈里为什么存下标而不是存值?

结算时既要拿值做比较,又要知道「给谁写答案」和「隔了多远」。只存值的话,res[j] 写不出去、每日温度算不出天数、柱状图算不出左边界。常见写法是栈里存下标、比较时用 a[栈顶] 取值,两件事都保住。

柱状图最大矩形为什么一定要补哨兵?

栈里等着结算的柱子,是「还不知道右边界在哪」的那些。真实数据扫完后,最高的一批柱子通常还压在栈底,没有更矮的柱子来触发结算,它们的宽度就算不出来,最大矩形可能落在这批里,答案直接偏小。补一个高度 0 的下标 n 作虚拟右端,能保证栈被清空。

下一个更大元素用 < 还是 <=?

用 <。相等的两根柱子不构成「更大」,写成 <= 会让左边那根把右边相等的值当成答案,结果数组就错了。同理,每日温度问的是「更暖的一天」,等温不算。等值要不要弹出,取决于题目问的是严格大于还是不小于,这是单调栈里最容易答错的细节。

单调栈和单调队列是一回事吗?

同一个思想的两个方向。栈管「等一个能打破单调的元素来结算」,答案在元素被弹出的那一刻定下来;队列管「滑动窗口里的极值」,元素离开窗口就必须出队。求区间最值用队列,求左右第一个更大/更小用栈。

演示编号 D03无需安装,手机端同样可用按 Ctrl + K 搜工具与演示