可用数组模拟单调递减栈解决“下一个更大元素”问题:用int[]+top指针实现入栈stack[++top]=val、出栈val=stack[top--]、查顶stack[top],遍历nums2时弹出小于当前数的栈顶并记录映射,未弹出者结果为-1。

在 Java 中,可以用数组模拟栈结构来实现单调栈逻辑,解决“下一个更大元素”这类问题。核心思路是:维护一个从栈底到栈顶严格递减的数组栈(即单调递减栈),遍历原数组时,用当前元素“弹出”所有比它小的栈顶元素,并记录这些元素的“下一个更大值”为当前元素。
用数组模拟栈的关键操作
不依赖 Stack 或 Deque,仅用一个整型数组 + 一个指针(top)管理栈:
- 入栈:`stack[++top] = value`(先移动指针再存值)
- 出栈:`int val = stack[top--]`(先取值再移动指针)
-
查看栈顶:`stack[top]`(需确保
top >= 0) - 判空:`top == -1`
处理“下一个更大元素 I”(LeetCode 496)的典型流程
给定两个没有重复元素的数组 nums1 和 nums2,对 nums1 中每个元素,在 nums2 中找出其右边第一个更大的数。可用单调栈预处理 nums2 的答案映射:
- 初始化长度为
nums2.length的数组stack和top = -1 - 创建
HashMap<Integer, Integer>存储每个数对应的“下一个更大值”,默认填-1 - 从左到右遍历
nums2:- 当栈非空且
nums2[i] > stack[top]→ 弹出栈顶,设其“下一个更大值”为nums2[i] - 将
nums2[i]入栈
- 当栈非空且
- 最后遍历
nums1,查哈希表得结果
注意边界与常见坑点
用数组实现时容易忽略的细节:
立即学习“Java免费学习笔记(深入)”;
-
栈数组大小要足够:一般设为输入数组长度,避免越界(如
new int[nums2.length]) -
栈指针初始为 -1,不是 0;每次入栈前检查
top < stack.length - 1 -
比较的是数值,不是下标:若需返回下标(如“下一个更大元素 II”),栈中应存下标,访问时用
nums2[stack[top]] - 未被弹出的元素 对应结果保持默认值(-1),无需额外清空栈
一个简化的代码片段示意
以 nums2 = [2,1,3,4] 为例,单调栈过程如下:
- i=0,入 2 → [2]
- i=1,1 ≤ 2,入 1 → [2,1]
- i=2,3 > 1 → 弹出 1,map.put(1,3);3 > 2 → 弹出 2,map.put(2,3);入 3 → [3]
- i=3,4 > 3 → 弹出 3,map.put(3,4);入 4 → [4]
- 最终 map = {1→3, 2→3, 3→4, 4→-1}


















