From fc320b5d5d8c80ab5747fe9214d2939b780dbcb8 Mon Sep 17 00:00:00 2001 From: sgindeed Date: Tue, 7 Oct 2025 11:01:11 +0530 Subject: [PATCH 1/3] feat: add nearest element stack algorithms with JUnit tests --- .../thealgorithms/stacks/NearestElement.java | 73 +++++++++++++++++++ .../stacks/NearestElementTest.java | 35 +++++++++ 2 files changed, 108 insertions(+) create mode 100644 src/main/java/com/thealgorithms/stacks/NearestElement.java create mode 100644 src/test/java/com/thealgorithms/stacks/NearestElementTest.java diff --git a/src/main/java/com/thealgorithms/stacks/NearestElement.java b/src/main/java/com/thealgorithms/stacks/NearestElement.java new file mode 100644 index 000000000000..78d8a2479d25 --- /dev/null +++ b/src/main/java/com/thealgorithms/stacks/NearestElement.java @@ -0,0 +1,73 @@ +package com.thealgorithms.datastructures.stacks; + +import java.util.Stack; +import java.util.Arrays; + +public final class NearestElement { + + private NearestElement() {} + + public static int[] nearestGreaterToRight(int[] arr) { + int n = arr.length; + int[] result = new int[n]; + Stack indexStack = new Stack<>(); + for (int i = n - 1; i >= 0; i--) { + while (!indexStack.isEmpty() && arr[i] >= arr[indexStack.peek()]) { + indexStack.pop(); + } + result[i] = indexStack.isEmpty() ? -1 : arr[indexStack.peek()]; + indexStack.push(i); + } + return result; + } + + public static int[] nearestGreaterToLeft(int[] arr) { + int n = arr.length; + int[] result = new int[n]; + Stack indexStack = new Stack<>(); + for (int i = 0; i < n; i++) { + while (!indexStack.isEmpty() && arr[i] >= arr[indexStack.peek()]) { + indexStack.pop(); + } + result[i] = indexStack.isEmpty() ? -1 : arr[indexStack.peek()]; + indexStack.push(i); + } + return result; + } + + public static int[] nearestSmallerToRight(int[] arr) { + int n = arr.length; + int[] result = new int[n]; + Stack indexStack = new Stack<>(); + for (int i = n - 1; i >= 0; i--) { + while (!indexStack.isEmpty() && arr[i] <= arr[indexStack.peek()]) { + indexStack.pop(); + } + result[i] = indexStack.isEmpty() ? -1 : arr[indexStack.peek()]; + indexStack.push(i); + } + return result; + } + + public static int[] nearestSmallerToLeft(int[] arr) { + int n = arr.length; + int[] result = new int[n]; + Stack indexStack = new Stack<>(); + for (int i = 0; i < n; i++) { + while (!indexStack.isEmpty() && arr[i] <= arr[indexStack.peek()]) { + indexStack.pop(); + } + result[i] = indexStack.isEmpty() ? -1 : arr[indexStack.peek()]; + indexStack.push(i); + } + return result; + } + + public static void main(String[] args) { + int[] sampleArray = {4, 5, 2, 10, 8}; + System.out.println("Nearest Greater to Right: " + Arrays.toString(nearestGreaterToRight(sampleArray))); + System.out.println("Nearest Greater to Left: " + Arrays.toString(nearestGreaterToLeft(sampleArray))); + System.out.println("Nearest Smaller to Right: " + Arrays.toString(nearestSmallerToRight(sampleArray))); + System.out.println("Nearest Smaller to Left: " + Arrays.toString(nearestSmallerToLeft(sampleArray))); + } +} diff --git a/src/test/java/com/thealgorithms/stacks/NearestElementTest.java b/src/test/java/com/thealgorithms/stacks/NearestElementTest.java new file mode 100644 index 000000000000..13920348c0c5 --- /dev/null +++ b/src/test/java/com/thealgorithms/stacks/NearestElementTest.java @@ -0,0 +1,35 @@ +package com.thealgorithms.datastructures.stacks; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; + +public class NearestElementTest { + + @Test + public void testNearestGreaterToRight() { + int[] arr = {4, 5, 2, 10, 8}; + int[] expected = {5, 10, 10, -1, -1}; + assertArrayEquals(expected, NearestElement.nearestGreaterToRight(arr)); + } + + @Test + public void testNearestGreaterToLeft() { + int[] arr = {4, 5, 2, 10, 8}; + int[] expected = {-1, -1, 5, -1, 10}; + assertArrayEquals(expected, NearestElement.nearestGreaterToLeft(arr)); + } + + @Test + public void testNearestSmallerToRight() { + int[] arr = {4, 5, 2, 10, 8}; + int[] expected = {2, 2, -1, 8, -1}; + assertArrayEquals(expected, NearestElement.nearestSmallerToRight(arr)); + } + + @Test + public void testNearestSmallerToLeft() { + int[] arr = {4, 5, 2, 10, 8}; + int[] expected = {-1, 4, -1, 2, 2}; + assertArrayEquals(expected, NearestElement.nearestSmallerToLeft(arr)); + } +} From db3fd3551d607953a056d5f37e69ccc0468d43aa Mon Sep 17 00:00:00 2001 From: sgindeed Date: Tue, 7 Oct 2025 11:15:41 +0530 Subject: [PATCH 2/3] test: increase coverage for edge cases and private constructor --- .../stacks/NearestElementTest.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/test/java/com/thealgorithms/stacks/NearestElementTest.java b/src/test/java/com/thealgorithms/stacks/NearestElementTest.java index 13920348c0c5..e77e3f0ca82b 100644 --- a/src/test/java/com/thealgorithms/stacks/NearestElementTest.java +++ b/src/test/java/com/thealgorithms/stacks/NearestElementTest.java @@ -32,4 +32,27 @@ public void testNearestSmallerToLeft() { int[] expected = {-1, 4, -1, 2, 2}; assertArrayEquals(expected, NearestElement.nearestSmallerToLeft(arr)); } + + @Test + void testEmptyArray() { + int[] arr = {}; + assertArrayEquals(new int[]{}, NearestElement.nearestGreaterToRight(arr)); + assertArrayEquals(new int[]{}, NearestElement.nearestGreaterToLeft(arr)); +} + + @Test + void testAllEqualElements() { + int[] arr = {5, 5, 5, 5}; + assertArrayEquals(new int[]{-1, -1, -1, -1}, NearestElement.nearestGreaterToRight(arr)); + assertArrayEquals(new int[]{-1, -1, -1, -1}, NearestElement.nearestGreaterToLeft(arr)); +} + + @Test + void testPrivateConstructor() throws Exception { + var constructor = NearestElement.class.getDeclaredConstructor(); + constructor.setAccessible(true); + constructor.newInstance(); +} + + } From b4739f88be8fbf212ac5d986e4c79e55ab5f6ceb Mon Sep 17 00:00:00 2001 From: sgindeed Date: Tue, 7 Oct 2025 11:20:03 +0530 Subject: [PATCH 3/3] fix: correct package declaration for NearestElement and update imports in test --- .../java/com/thealgorithms/stacks/NearestElement.java | 2 +- .../com/thealgorithms/stacks/NearestElementTest.java | 10 ++++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/thealgorithms/stacks/NearestElement.java b/src/main/java/com/thealgorithms/stacks/NearestElement.java index 78d8a2479d25..7cb4b103896b 100644 --- a/src/main/java/com/thealgorithms/stacks/NearestElement.java +++ b/src/main/java/com/thealgorithms/stacks/NearestElement.java @@ -1,4 +1,4 @@ -package com.thealgorithms.datastructures.stacks; +package com.thealgorithms.stacks; import java.util.Stack; import java.util.Arrays; diff --git a/src/test/java/com/thealgorithms/stacks/NearestElementTest.java b/src/test/java/com/thealgorithms/stacks/NearestElementTest.java index e77e3f0ca82b..57fae10d5f96 100644 --- a/src/test/java/com/thealgorithms/stacks/NearestElementTest.java +++ b/src/test/java/com/thealgorithms/stacks/NearestElementTest.java @@ -1,4 +1,4 @@ -package com.thealgorithms.datastructures.stacks; +package com.thealgorithms.stacks; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertArrayEquals; @@ -38,21 +38,19 @@ void testEmptyArray() { int[] arr = {}; assertArrayEquals(new int[]{}, NearestElement.nearestGreaterToRight(arr)); assertArrayEquals(new int[]{}, NearestElement.nearestGreaterToLeft(arr)); -} + } @Test void testAllEqualElements() { int[] arr = {5, 5, 5, 5}; assertArrayEquals(new int[]{-1, -1, -1, -1}, NearestElement.nearestGreaterToRight(arr)); assertArrayEquals(new int[]{-1, -1, -1, -1}, NearestElement.nearestGreaterToLeft(arr)); -} + } @Test void testPrivateConstructor() throws Exception { var constructor = NearestElement.class.getDeclaredConstructor(); constructor.setAccessible(true); constructor.newInstance(); -} - - + } }