Skip to content

Commit 30504c1

Browse files
authored
Add MinStackUsingSingleStack algorithm (#5759)
1 parent 8886e09 commit 30504c1

File tree

3 files changed

+135
-0
lines changed

3 files changed

+135
-0
lines changed

DIRECTORY.md

+4
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,7 @@
431431
* [StrobogrammaticNumber](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/StrobogrammaticNumber.java)
432432
* [SumOfArithmeticSeries](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/SumOfArithmeticSeries.java)
433433
* [SumOfDigits](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/SumOfDigits.java)
434+
* [SumOfOddNumbers](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/SumOfOddNumbers.java)
434435
* [SumWithoutArithmeticOperators](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/SumWithoutArithmeticOperators.java)
435436
* [TrinomialTriangle](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/TrinomialTriangle.java)
436437
* [TwinPrime](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/TwinPrime.java)
@@ -612,6 +613,7 @@
612613
* [InfixToPrefix](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/stacks/InfixToPrefix.java)
613614
* [LargestRectangle](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/stacks/LargestRectangle.java)
614615
* [MaximumMinimumWindow](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/stacks/MaximumMinimumWindow.java)
616+
* [MinStackUsingSingleStack](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/stacks/MinStackUsingSingleStack.java)
615617
* [NextGreaterElement](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/stacks/NextGreaterElement.java)
616618
* [NextSmallerElement](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/stacks/NextSmallerElement.java)
617619
* [PostfixEvaluator](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/stacks/PostfixEvaluator.java)
@@ -1009,6 +1011,7 @@
10091011
* [StrobogrammaticNumberTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/StrobogrammaticNumberTest.java)
10101012
* [SumOfArithmeticSeriesTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/SumOfArithmeticSeriesTest.java)
10111013
* [SumOfDigitsTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/SumOfDigitsTest.java)
1014+
* [SumOfOddNumbersTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/SumOfOddNumbersTest.java)
10121015
* [SumWithoutArithmeticOperatorsTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/SumWithoutArithmeticOperatorsTest.java)
10131016
* [TestArmstrong](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/TestArmstrong.java)
10141017
* [TwinPrimeTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/TwinPrimeTest.java)
@@ -1164,6 +1167,7 @@
11641167
* [InfixToPostfixTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/stacks/InfixToPostfixTest.java)
11651168
* [InfixToPrefixTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/stacks/InfixToPrefixTest.java)
11661169
* [LargestRectangleTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/stacks/LargestRectangleTest.java)
1170+
* [MinStackUsingSingleStackTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/stacks/MinStackUsingSingleStackTest.java)
11671171
* [NextGreaterElementTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/stacks/NextGreaterElementTest.java)
11681172
* [NextSmallerElementTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/stacks/NextSmallerElementTest.java)
11691173
* [PostfixEvaluatorTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/stacks/PostfixEvaluatorTest.java)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package com.thealgorithms.stacks;
2+
3+
import java.util.EmptyStackException;
4+
import java.util.Stack;
5+
6+
/**
7+
* Min-Stack implementation using a single stack.
8+
*
9+
* This stack supports push, pop, and retrieving the minimum element
10+
* in constant time (O(1)) using a modified approach where the stack
11+
* stores both the element and the minimum value so far.
12+
*
13+
* @author Hardvan
14+
*/
15+
public class MinStackUsingSingleStack {
16+
private final Stack<long[]> stack = new Stack<>();
17+
18+
/**
19+
* Pushes a new value onto the stack.
20+
* Each entry stores both the value and the minimum value so far.
21+
*
22+
* @param value The value to be pushed onto the stack.
23+
*/
24+
public void push(int value) {
25+
if (stack.isEmpty()) {
26+
stack.push(new long[] {value, value});
27+
} else {
28+
long minSoFar = Math.min(value, stack.peek()[1]);
29+
stack.push(new long[] {value, minSoFar});
30+
}
31+
}
32+
33+
/**
34+
* Removes the top element from the stack.
35+
*/
36+
public void pop() {
37+
if (!stack.isEmpty()) {
38+
stack.pop();
39+
}
40+
}
41+
42+
/**
43+
* Retrieves the top element from the stack.
44+
*
45+
* @return The top element of the stack.
46+
*/
47+
public int top() {
48+
if (!stack.isEmpty()) {
49+
return (int) stack.peek()[0];
50+
}
51+
throw new EmptyStackException();
52+
}
53+
54+
/**
55+
* Retrieves the minimum element in the stack.
56+
*
57+
* @return The minimum element so far.
58+
*/
59+
public int getMin() {
60+
if (!stack.isEmpty()) {
61+
return (int) stack.peek()[1];
62+
}
63+
throw new EmptyStackException();
64+
}
65+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package com.thealgorithms.stacks;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertThrows;
5+
6+
import java.util.EmptyStackException;
7+
import org.junit.jupiter.api.Test;
8+
9+
public class MinStackUsingSingleStackTest {
10+
11+
@Test
12+
public void testBasicOperations() {
13+
MinStackUsingSingleStack minStack = new MinStackUsingSingleStack();
14+
15+
minStack.push(3);
16+
minStack.push(5);
17+
assertEquals(3, minStack.getMin(), "Minimum should be 3");
18+
19+
minStack.push(2);
20+
minStack.push(1);
21+
assertEquals(1, minStack.getMin(), "Minimum should be 1");
22+
23+
minStack.pop();
24+
assertEquals(2, minStack.getMin(), "Minimum should be 2");
25+
26+
minStack.pop();
27+
assertEquals(3, minStack.getMin(), "Minimum should be 3");
28+
}
29+
30+
@Test
31+
public void testTopElement() {
32+
MinStackUsingSingleStack minStack = new MinStackUsingSingleStack();
33+
34+
minStack.push(8);
35+
minStack.push(10);
36+
assertEquals(10, minStack.top(), "Top element should be 10");
37+
38+
minStack.pop();
39+
assertEquals(8, minStack.top(), "Top element should be 8");
40+
}
41+
42+
@Test
43+
public void testGetMinAfterPops() {
44+
MinStackUsingSingleStack minStack = new MinStackUsingSingleStack();
45+
46+
minStack.push(5);
47+
minStack.push(3);
48+
minStack.push(7);
49+
50+
assertEquals(3, minStack.getMin(), "Minimum should be 3");
51+
52+
minStack.pop(); // Popping 7
53+
assertEquals(3, minStack.getMin(), "Minimum should still be 3");
54+
55+
minStack.pop(); // Popping 3
56+
assertEquals(5, minStack.getMin(), "Minimum should now be 5");
57+
}
58+
59+
@Test
60+
public void testEmptyStack() {
61+
MinStackUsingSingleStack minStack = new MinStackUsingSingleStack();
62+
63+
assertThrows(EmptyStackException.class, minStack::top, "Should throw exception on top()");
64+
assertThrows(EmptyStackException.class, minStack::getMin, "Should throw exception on getMin()");
65+
}
66+
}

0 commit comments

Comments
 (0)