单调栈,即栈中的元素按一定的顺序单调排列。当遇到不满足入栈条件的值的时候,先从栈中出栈一部分元素,直到能够让这个元素入栈位置。

    例题 :现有数组5 4 6 7 2 3 0 1,请求出数组中的每一个数字左边离他最近的比它大的数和右边离他最近的比他大的数字?如果没有就用-1表示
    答案:-1 65 6-1 7-1 -17 37 -13 13 -1

    1. public class MonotonousStack1 {
    2. public static void main(String[] args) {
    3. int[] array = new int[]{5,4,6,7,2,3,0,1};
    4. monotonousStack(array);
    5. }
    6. public static void monotonousStack(int[] array) {
    7. //栈结构,存储索引
    8. Stack<Integer> stack = new Stack<>();
    9. //让栈中的元素从大到小排列
    10. for (int i=0;i<array.length;i++) {
    11. if (stack.isEmpty() || array[stack.peek()]>array[i]) {
    12. stack.push(i);
    13. } else {
    14. while (!stack.isEmpty() && array[stack.peek()] < array[i]) {
    15. int p = array[stack.pop()];
    16. int left = stack.isEmpty()? -1 : array[stack.peek()];
    17. int right = array[i];
    18. System.out.println(p + "->left:" + left + " right:" + right);
    19. }
    20. stack.push(i);
    21. }
    22. }
    23. while (!stack.isEmpty()) {
    24. int p = array[stack.pop()];
    25. int left = stack.isEmpty()? -1 : array[stack.peek()];
    26. int right = -1;
    27. System.out.println(p + "->left:" + left + " right:" + right);
    28. }
    29. }
    30. }

    image.png
    显然一开始按照降序排列,等遇到无法入栈的情况的时候,说明栈中有一部分的元素找到了右边最近的大于它的值,所以在这个时候全部出栈。