数组实现单调栈可高效求解“下一个更大元素”:预分配固定空间,用top指针控制栈顶,遍历中弹出小于当前元素的索引并记录结果,时间复杂度O(n)、空间O(n),避免扩容与方法调用开销,缓存友好。

用数组实现单调栈来解决“搜索最近更大元素”问题,性能高效且内存友好——核心在于维护一个严格递减(或递增)的数组栈,通过一次遍历完成所有查询,时间复杂度稳定为 O(n),空间复杂度 O(n)。
为什么数组比链表/Stack类更优?
Java 的 Stack 类基于 Vector、线程安全但慢;Python 的 list 虽可当栈用,但频繁 append/pop 在底层仍涉及动态扩容与边界检查。而手动用数组模拟栈,能:
- 预分配固定大小(如输入长度),避免扩容开销
- 用整数指针
top控制栈顶,读写均为 O(1) 数组索引操作 - 无对象封装、无方法调用,CPU 缓存更友好
数组单调栈的核心逻辑(以“下一个更大元素”为例)
目标:对每个位置 i,找其右侧第一个值 > nums[i] 的元素下标(或值)。使用单调递减栈(栈中存索引,对应值从底到顶递减):
- 遍历数组,当前索引为
i - 若栈非空且
nums[i] > nums[stack[top]],说明i是栈顶索引的“下一个更大位置”,弹出并记录结果 - 重复上步直到不满足或栈空,再将
i压入栈 - 遍历结束,栈中剩余索引无更大元素,按需设为 -1 或 null
手写数组栈的关键代码结构(Java 示例)
不依赖任何集合类,纯数组 + top 指针:
int[] stack = new int[nums.length]; // 预分配
int top = -1; // 栈顶索引,-1 表示空栈
int[] res = new int[nums.length];
Arrays.fill(res, -1); // 默认无更大元素
for (int i = 0; i < nums.length; i++) {
while (top >= 0 && nums[i] > nums[stack[top]]) {
int idx = stack[top--];
res[idx] = nums[i]; // 或 res[idx] = i,依题意定
}
stack[++top] = i;
}
注意:top 初始为 -1,++top 先加后存,top-- 先取后减,符合栈行为。
实战优化点:避免冗余判断与缓存友好写法
- 用
while (top != -1 && ...)替代while (top >= 0 && ...),部分 JVM 更易优化 - 把
nums[stack[top]]提前读入局部变量,减少两次数组寻址 - 若只需下标而非值,可省去
res数组初始化填充,最后批量处理残留 - 对超大数组(如 10⁷ 级),考虑用
short[]存索引(若索引 < 65536),节省一半内存带宽


















