1. Stack(栈)简介
Stack是Java中的一种常见的数据结构,Stack在Java中是Vector的一个子类。
栈最重要的特点是先进后出。
2. 基础操作
- 创建栈
// 创建一个空栈
Stack<Character> stack=new Stack<>();
- 查看栈是否为空
stack.isEmpty();
- 查看堆栈顶部的对象,但不从堆栈中移除它
stack.peek();
- 移除并返回堆栈顶部的对象
stack.pop();
- 把元素压入堆栈顶部
stack.push();
- 返回对象在堆栈中的位置,以 1 为基数
stack.search(Object element);
3. 单调栈思想
单调,即单调递增或单调递减(因此单调栈也分为单调递增栈或者单调递减栈),因此单调栈里存放的数据应该都是有序的。那么如何实现这样一种有序呢?
例如有这样一组数据:[1,5,7,9,4,3],要求从左往右依次入单调递增栈。那么入栈的思想是:
如果栈空或者入栈元素大于栈顶元素,则入栈;否则(栈不空且入栈元素小于栈顶元素),需要依次把栈顶元素出栈,直到栈顶元素小于当前元素。
按照上面的思想:
-
1入栈; // 栈为[1]
-
5 > 1 ,直接入栈,栈此时为[1,5]
-
7 > 5 ,直接入栈,栈此时为[1,5,7]
-
9 > 7 ,直接入栈,栈此时为[1,5,7,9]
-
4 < 9 ,因此要将9出栈,栈此时为[1,5,7]
4 < 7 ,因此要将7出栈, 栈此时为[1,5]
4 < 5 ,因此要将5出栈,栈此时为[1]
4 > 1 ,入栈,栈此时为[1,4] -
3 < 4 , 因此要将4出栈,栈此时为[1]
3 > 1 , 入栈,栈此时为[1,3]
// ----------------------------伪代码----------------------------
for (遍历这个数组){
while (栈不为空 && 入栈元素 < 当前元素){
栈顶元素出栈;
更新结果;
}
当前元素入栈;
}
单调栈思想的应用详见[LeetCode]503. 下一个更大元素 II(java实现)