From d94c96c999aff83baf803fbc577b9628bce35210 Mon Sep 17 00:00:00 2001 From: NayanSaraff Date: Fri, 3 Oct 2025 10:09:18 +0530 Subject: [PATCH 1/7] Add MonotonicStack class with element retrieval methods --- .../stacks/Monotonic_Increasing_Stack.java | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 src/test/java/com/thealgorithms/stacks/Monotonic_Increasing_Stack.java diff --git a/src/test/java/com/thealgorithms/stacks/Monotonic_Increasing_Stack.java b/src/test/java/com/thealgorithms/stacks/Monotonic_Increasing_Stack.java new file mode 100644 index 000000000000..e9f346ca3ca5 --- /dev/null +++ b/src/test/java/com/thealgorithms/stacks/Monotonic_Increasing_Stack.java @@ -0,0 +1,55 @@ +import java.util.*; + +public class MonotonicStack { + + // Returns Next Greater Element for each element in the array + public static int[] nextGreaterElement(int[] arr) { + int n = arr.length; + int[] result = new int[n]; + Stack stack = new Stack<>(); // stores indices + + for (int i = n - 1; i >= 0; i--) { + // Pop elements smaller or equal to arr[i] + while (!stack.isEmpty() && arr[i] >= arr[stack.peek()]) { + stack.pop(); + } + + // If stack is empty, no greater element to the right + result[i] = stack.isEmpty() ? -1 : arr[stack.peek()]; + + // Push current index onto stack + stack.push(i); + } + + return result; + } + + // Returns Next Smaller Element for each element in the array + public static int[] nextSmallerElement(int[] arr) { + int n = arr.length; + int[] result = new int[n]; + Stack stack = new Stack<>(); // stores indices + + for (int i = n - 1; i >= 0; i--) { + // Pop elements greater or equal to arr[i] + while (!stack.isEmpty() && arr[i] <= arr[stack.peek()]) { + stack.pop(); + } + + result[i] = stack.isEmpty() ? -1 : arr[stack.peek()]; + stack.push(i); + } + + return result; + } + + public static void main(String[] args) { + int[] arr = {4, 5, 2, 10, 8}; + + int[] nextGreater = nextGreaterElement(arr); + int[] nextSmaller = nextSmallerElement(arr); + + System.out.println("Next Greater Element: " + Arrays.toString(nextGreater)); + System.out.println("Next Smaller Element: " + Arrays.toString(nextSmaller)); + } +} From 8bd26a1afe9e85c342596a2097e578390e1982ae Mon Sep 17 00:00:00 2001 From: NayanSaraff Date: Fri, 3 Oct 2025 10:12:15 +0530 Subject: [PATCH 2/7] Rename Monotonic_Increasing_Stack.java to MonotonicIncreasingStack.java --- ...otonic_Increasing_Stack.java => MonotonicIncreasingStack.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/test/java/com/thealgorithms/stacks/{Monotonic_Increasing_Stack.java => MonotonicIncreasingStack.java} (100%) diff --git a/src/test/java/com/thealgorithms/stacks/Monotonic_Increasing_Stack.java b/src/test/java/com/thealgorithms/stacks/MonotonicIncreasingStack.java similarity index 100% rename from src/test/java/com/thealgorithms/stacks/Monotonic_Increasing_Stack.java rename to src/test/java/com/thealgorithms/stacks/MonotonicIncreasingStack.java From 8cfd530dc59cdd049944b805528d8e3e5a461cd1 Mon Sep 17 00:00:00 2001 From: NayanSaraff Date: Fri, 3 Oct 2025 10:13:49 +0530 Subject: [PATCH 3/7] Add comments to MonotonicIncreasingStack.java Added a comment block explaining the Monotonic Increasing Stack algorithm and its applications. --- .../com/thealgorithms/stacks/MonotonicIncreasingStack.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/test/java/com/thealgorithms/stacks/MonotonicIncreasingStack.java b/src/test/java/com/thealgorithms/stacks/MonotonicIncreasingStack.java index e9f346ca3ca5..58d653e0666d 100644 --- a/src/test/java/com/thealgorithms/stacks/MonotonicIncreasingStack.java +++ b/src/test/java/com/thealgorithms/stacks/MonotonicIncreasingStack.java @@ -1,3 +1,9 @@ +/*Contributor: Nayan Saraff + +This Monotonic Increasing Stack is a popular algorithm which helps +in solving various problems including the Stock Span, Trapping Rain water*/ + + import java.util.*; public class MonotonicStack { From e52b2edae71c51b17dd0560a95452297a8477d34 Mon Sep 17 00:00:00 2001 From: NayanSaraff Date: Fri, 3 Oct 2025 10:16:09 +0530 Subject: [PATCH 4/7] Add reference link for monotonic stack implementation Added a comment with a reference link for monotonic stack. --- .../java/com/thealgorithms/stacks/MonotonicIncreasingStack.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/test/java/com/thealgorithms/stacks/MonotonicIncreasingStack.java b/src/test/java/com/thealgorithms/stacks/MonotonicIncreasingStack.java index 58d653e0666d..aad1603b6169 100644 --- a/src/test/java/com/thealgorithms/stacks/MonotonicIncreasingStack.java +++ b/src/test/java/com/thealgorithms/stacks/MonotonicIncreasingStack.java @@ -59,3 +59,5 @@ public static void main(String[] args) { System.out.println("Next Smaller Element: " + Arrays.toString(nextSmaller)); } } + +/* https://www.geeksforgeeks.org/dsa/introduction-to-monotonic-stack-2/ */ From 1debee090e18e4876953a456e22d667f40d13b2b Mon Sep 17 00:00:00 2001 From: NayanSaraff Date: Fri, 3 Oct 2025 10:28:45 +0530 Subject: [PATCH 5/7] Rename MonotonicStack to MonotonicIncreasingStack --- .../java/com/thealgorithms/stacks/MonotonicIncreasingStack.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/thealgorithms/stacks/MonotonicIncreasingStack.java b/src/test/java/com/thealgorithms/stacks/MonotonicIncreasingStack.java index aad1603b6169..72b8ef48ed0c 100644 --- a/src/test/java/com/thealgorithms/stacks/MonotonicIncreasingStack.java +++ b/src/test/java/com/thealgorithms/stacks/MonotonicIncreasingStack.java @@ -6,7 +6,7 @@ import java.util.*; -public class MonotonicStack { +public class MonotonicIncreasingStack { // Returns Next Greater Element for each element in the array public static int[] nextGreaterElement(int[] arr) { From 3d026b5269e4c20f5db6fef19ab14cff39f26691 Mon Sep 17 00:00:00 2001 From: NayanSaraff Date: Fri, 3 Oct 2025 10:31:53 +0530 Subject: [PATCH 6/7] Fix comments and formatting in MonotonicIncreasingStack --- .../stacks/MonotonicIncreasingStack.java | 50 ++++++++++--------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/src/test/java/com/thealgorithms/stacks/MonotonicIncreasingStack.java b/src/test/java/com/thealgorithms/stacks/MonotonicIncreasingStack.java index 72b8ef48ed0c..8aceb02e4ab9 100644 --- a/src/test/java/com/thealgorithms/stacks/MonotonicIncreasingStack.java +++ b/src/test/java/com/thealgorithms/stacks/MonotonicIncreasingStack.java @@ -1,44 +1,45 @@ -/*Contributor: Nayan Saraff +/* Contributor: Nayan Saraff + * + * This Monotonic Increasing Stack is a popular algorithm which helps + * in solving various problems including Stock Span, Trapping Rain Water + */ -This Monotonic Increasing Stack is a popular algorithm which helps -in solving various problems including the Stock Span, Trapping Rain water*/ +import java.util.Arrays; +import java.util.Stack; +public class MonotonicIncreasingStack +{ -import java.util.*; - -public class MonotonicIncreasingStack { - - // Returns Next Greater Element for each element in the array - public static int[] nextGreaterElement(int[] arr) { + public static int[] nextGreaterElement(int[] arr) + { int n = arr.length; int[] result = new int[n]; - Stack stack = new Stack<>(); // stores indices + Stack stack = new Stack<>(); - for (int i = n - 1; i >= 0; i--) { - // Pop elements smaller or equal to arr[i] - while (!stack.isEmpty() && arr[i] >= arr[stack.peek()]) { + for (int i = n - 1; i >= 0; i--) + { + while (!stack.isEmpty() && arr[i] >= arr[stack.peek()]) + { stack.pop(); } - // If stack is empty, no greater element to the right result[i] = stack.isEmpty() ? -1 : arr[stack.peek()]; - - // Push current index onto stack stack.push(i); } return result; } - // Returns Next Smaller Element for each element in the array - public static int[] nextSmallerElement(int[] arr) { + public static int[] nextSmallerElement(int[] arr) + { int n = arr.length; int[] result = new int[n]; - Stack stack = new Stack<>(); // stores indices + Stack stack = new Stack<>(); - for (int i = n - 1; i >= 0; i--) { - // Pop elements greater or equal to arr[i] - while (!stack.isEmpty() && arr[i] <= arr[stack.peek()]) { + for (int i = n - 1; i >= 0; i--) + { + while (!stack.isEmpty() && arr[i] <= arr[stack.peek()]) + { stack.pop(); } @@ -49,7 +50,8 @@ public static int[] nextSmallerElement(int[] arr) { return result; } - public static void main(String[] args) { + public static void main(String[] args) + { int[] arr = {4, 5, 2, 10, 8}; int[] nextGreater = nextGreaterElement(arr); @@ -60,4 +62,4 @@ public static void main(String[] args) { } } -/* https://www.geeksforgeeks.org/dsa/introduction-to-monotonic-stack-2/ */ +/* Reference: https://www.geeksforgeeks.org/dsa/introduction-to-monotonic-stack-2/ */ From af850320566506eadb5ec19f2b01b5bc9a2ee362 Mon Sep 17 00:00:00 2001 From: NayanSaraff Date: Fri, 3 Oct 2025 10:43:40 +0530 Subject: [PATCH 7/7] Refactor MonotonicIncreasingStack for utility class --- .../stacks/MonotonicIncreasingStack.java | 32 +++++++------------ 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/src/test/java/com/thealgorithms/stacks/MonotonicIncreasingStack.java b/src/test/java/com/thealgorithms/stacks/MonotonicIncreasingStack.java index 8aceb02e4ab9..66567faeac8f 100644 --- a/src/test/java/com/thealgorithms/stacks/MonotonicIncreasingStack.java +++ b/src/test/java/com/thealgorithms/stacks/MonotonicIncreasingStack.java @@ -7,51 +7,43 @@ import java.util.Arrays; import java.util.Stack; -public class MonotonicIncreasingStack -{ +public class MonotonicIncreasingStack { - public static int[] nextGreaterElement(int[] arr) - { + private MonotonicIncreasingStack() { + throw new AssertionError("Cannot instantiate utility class"); + } + + public static int[] nextGreaterElement(int[] arr) { int n = arr.length; int[] result = new int[n]; Stack stack = new Stack<>(); - for (int i = n - 1; i >= 0; i--) - { - while (!stack.isEmpty() && arr[i] >= arr[stack.peek()]) - { + for (int i = n - 1; i >= 0; i--) { + while (!stack.isEmpty() && arr[i] >= arr[stack.peek()]) { stack.pop(); } - result[i] = stack.isEmpty() ? -1 : arr[stack.peek()]; stack.push(i); } - return result; } - public static int[] nextSmallerElement(int[] arr) - { + public static int[] nextSmallerElement(int[] arr) { int n = arr.length; int[] result = new int[n]; Stack stack = new Stack<>(); - for (int i = n - 1; i >= 0; i--) - { - while (!stack.isEmpty() && arr[i] <= arr[stack.peek()]) - { + for (int i = n - 1; i >= 0; i--) { + while (!stack.isEmpty() && arr[i] <= arr[stack.peek()]) { stack.pop(); } - result[i] = stack.isEmpty() ? -1 : arr[stack.peek()]; stack.push(i); } - return result; } - public static void main(String[] args) - { + public static void main(String[] args) { int[] arr = {4, 5, 2, 10, 8}; int[] nextGreater = nextGreaterElement(arr);