Skip to content
Merged
Show file tree
Hide file tree
Changes from 14 commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
85c237e
added retrieval of minimum and maximum element from stack at O(1)
S-M-J-I Oct 11, 2024
b4e2d90
added problem statement
S-M-J-I Oct 11, 2024
4d64839
Merge branch 'master' into SMJI/stack/min_max_const_time
S-M-J-I Oct 11, 2024
d9c754e
added JUnit tests
S-M-J-I Oct 11, 2024
2ec74a9
added more JUnit tests
S-M-J-I Oct 11, 2024
527763e
fix: * imports
S-M-J-I Oct 11, 2024
b1deddd
fix: linter builds
S-M-J-I Oct 11, 2024
7206d30
fix: linter order
S-M-J-I Oct 11, 2024
dd8331d
fix: linter removed trailing space
S-M-J-I Oct 11, 2024
adeb454
Merge branch 'master' into SMJI/stack/min_max_const_time
S-M-J-I Oct 11, 2024
a1929a7
added push-pop after empty test case
S-M-J-I Oct 11, 2024
4878cf3
Merge branch 'SMJI/stack/min_max_const_time' of https://github.com/S-…
S-M-J-I Oct 11, 2024
adff619
Merge branch 'master' into SMJI/stack/min_max_const_time
S-M-J-I Oct 12, 2024
eb272d7
removed unecessary checks
S-M-J-I Oct 12, 2024
b14a627
Merge branch 'master' into SMJI/stack/min_max_const_time
S-M-J-I Oct 13, 2024
6c22b1b
changed refs
S-M-J-I Oct 13, 2024
ee31d7a
Merge branch 'master' into SMJI/stack/min_max_const_time
S-M-J-I Oct 13, 2024
9b91a20
fix: branch up-to-date merge error
S-M-J-I Oct 13, 2024
ef04ffe
Merge branch 'master' into SMJI/stack/min_max_const_time
S-M-J-I Oct 13, 2024
4e13a21
Merge branch 'master' into SMJI/stack/min_max_const_time
S-M-J-I Oct 13, 2024
15f1f84
Merge branch 'master' into SMJI/stack/min_max_const_time
S-M-J-I Oct 13, 2024
e272463
Merge branch 'master' into SMJI/stack/min_max_const_time
S-M-J-I Oct 13, 2024
bec0b18
Merge branch 'master' into SMJI/stack/min_max_const_time
S-M-J-I Oct 13, 2024
fdc4dac
Merge branch 'master' into SMJI/stack/min_max_const_time
S-M-J-I Oct 13, 2024
b97057c
Merge branch 'master' into SMJI/stack/min_max_const_time
S-M-J-I Oct 14, 2024
d3f4d5b
Merge branch 'master' into SMJI/stack/min_max_const_time
S-M-J-I Oct 14, 2024
b2b6fd1
Merge branch 'master' into SMJI/stack/min_max_const_time
S-M-J-I Oct 14, 2024
405ecce
Merge branch 'master' into SMJI/stack/min_max_const_time
S-M-J-I Oct 14, 2024
50343c0
Merge branch 'master' into SMJI/stack/min_max_const_time
S-M-J-I Oct 14, 2024
d1a40f5
Merge branch 'master' into SMJI/stack/min_max_const_time
S-M-J-I Oct 14, 2024
e27d574
Merge branch 'master' into SMJI/stack/min_max_const_time
S-M-J-I Oct 15, 2024
b0da2ec
Merge branch 'master' into SMJI/stack/min_max_const_time
S-M-J-I Oct 15, 2024
bb5dc41
Merge branch 'master' into SMJI/stack/min_max_const_time
S-M-J-I Oct 15, 2024
ebfe3cf
Merge branch 'master' into SMJI/stack/min_max_const_time
S-M-J-I Oct 15, 2024
ef03c66
Merge branch 'master' into SMJI/stack/min_max_const_time
S-M-J-I Oct 15, 2024
bc7e930
Merge branch 'master' into SMJI/stack/min_max_const_time
S-M-J-I Oct 15, 2024
f60a4d4
Merge branch 'master' into SMJI/stack/min_max_const_time
S-M-J-I Oct 16, 2024
dc73e5f
Merge branch 'master' into SMJI/stack/min_max_const_time
S-M-J-I Oct 21, 2024
2f4da6e
Merge branch 'master' into SMJI/stack/min_max_const_time
siriak Oct 22, 2024
88c78f2
Merge branch 'master' into SMJI/stack/min_max_const_time
siriak Oct 22, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package com.thealgorithms.stacks;

import java.util.NoSuchElementException;
import java.util.Stack;

/**
* A class that implements a stack that gives the maximum element in O(1) time.
* The mainStack is used to store the all the elements of the stack
* While the maxStack stores the maximum elements
* When we want to get a maximum element, we call the top of the maximum stack
*
* Problem: https://leetcode.com/problems/min-stack/
*/
public class GreatestElementConstantTime {
private Stack<Integer> mainStack;
private Stack<Integer> maxStack;

/**
* Constructs two empty stacks
*/
public GreatestElementConstantTime() {
mainStack = new Stack<>();
maxStack = new Stack<>();
}

/**
* Pushes an element onto the top of the stack.
* Checks if the element is the maximum or not
* If so, then pushes to the maximum stack
* @param data The element to be pushed onto the stack.
*/
public void push(int data) {
if (mainStack.isEmpty()) {
mainStack.push(data);
maxStack.push(data);
return;
}

mainStack.push(data);
if (data > maxStack.peek()) {
maxStack.push(data);
}
}

/**
* Pops an element from the stack.
* Checks if the element to be popped is the maximum or not
* If so, then pop from the minStack
*
* @throws NoSuchElementException if the stack is empty.
*/
public void pop() {
if (mainStack.isEmpty()) {
throw new NoSuchElementException("Stack is empty");
}

int ele = mainStack.pop();
if (ele == maxStack.peek()) {
maxStack.pop();
}
}

/**
* Returns the maximum element present in the stack
*
* @return The element at the top of the maxStack, or null if the stack is empty.
*/
public Integer getMaximumElement() {
if (maxStack.isEmpty()) {
return null;
}
return maxStack.peek();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package com.thealgorithms.stacks;

import java.util.NoSuchElementException;
import java.util.Stack;

/**
* A class that implements a stack that gives the minimum element in O(1) time.
* The mainStack is used to store the all the elements of the stack
* While the minStack stores the minimum elements
* When we want to get a minimum element, we call the top of the minimum stack
*/
public class SmallestElementConstantTime {
private Stack<Integer> mainStack;
private Stack<Integer> minStack;

/**
* Constructs two empty stacks
*/
public SmallestElementConstantTime() {
mainStack = new Stack<>();
minStack = new Stack<>();
}

/**
* Pushes an element onto the top of the stack.
* Checks if the element is the minimum or not
* If so, then pushes to the minimum stack
* @param data The element to be pushed onto the stack.
*/
public void push(int data) {
if (mainStack.isEmpty()) {
mainStack.push(data);
minStack.push(data);
return;
}

mainStack.push(data);
if (data < minStack.peek()) {
minStack.push(data);
}
}

/**
* Pops an element from the stack.
* Checks if the element to be popped is the minimum or not
* If so, then pop from the minStack
*
* @throws NoSuchElementException if the stack is empty.
*/
public void pop() {
if (mainStack.isEmpty()) {
throw new NoSuchElementException("Stack is empty");
}

int ele = mainStack.pop();
if (ele == minStack.peek()) {
minStack.pop();
}
}

/**
* Returns the minimum element present in the stack
*
* @return The element at the top of the minStack, or null if the stack is empty.
*/
public Integer getMinimumElement() {
if (minStack.isEmpty()) {
return null;
}
return minStack.peek();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package com.thealgorithms.stacks;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertThrows;

import java.util.NoSuchElementException;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

public class GreatestElementConstantTimeTest {

private GreatestElementConstantTime constantTime;

@BeforeEach
public void setConstantTime() {
constantTime = new GreatestElementConstantTime();
}

@Test
public void testMaxAtFirst() {
constantTime.push(1);
constantTime.push(10);
constantTime.push(20);
constantTime.push(5);
assertEquals(20, constantTime.getMaximumElement());
}

@Test
public void testMinTwo() {
constantTime.push(5);
constantTime.push(10);
constantTime.push(20);
constantTime.push(1);
assertEquals(20, constantTime.getMaximumElement());
constantTime.pop();
constantTime.pop();
assertEquals(10, constantTime.getMaximumElement());
}

@Test
public void testNullMax() {
constantTime.push(10);
constantTime.push(20);
constantTime.pop();
constantTime.pop();
assertNull(constantTime.getMaximumElement());
}

@Test
public void testBlankHandle() {
constantTime.push(10);
constantTime.push(1);
constantTime.pop();
constantTime.pop();
assertThrows(NoSuchElementException.class, () -> constantTime.pop());
}

@Test
public void testPushPopAfterEmpty() {
constantTime.push(10);
constantTime.push(1);
constantTime.pop();
constantTime.pop();
constantTime.push(5);
assertEquals(5, constantTime.getMaximumElement());
constantTime.push(1);
assertEquals(5, constantTime.getMaximumElement());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package com.thealgorithms.stacks;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertThrows;

import java.util.NoSuchElementException;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

public class SmallestElementConstantTimeTest {

private SmallestElementConstantTime sect;

@BeforeEach
public void setSect() {
sect = new SmallestElementConstantTime();
}

@Test
public void testMinAtFirst() {
sect.push(1);
sect.push(10);
sect.push(20);
sect.push(5);
assertEquals(1, sect.getMinimumElement());
}

@Test
public void testMinTwo() {
sect.push(5);
sect.push(10);
sect.push(20);
sect.push(1);
assertEquals(1, sect.getMinimumElement());
sect.pop();
assertEquals(5, sect.getMinimumElement());
}

@Test
public void testNullMin() {
sect.push(10);
sect.push(20);
sect.pop();
sect.pop();
assertNull(sect.getMinimumElement());
}

@Test
public void testBlankHandle() {
sect.push(10);
sect.push(1);
sect.pop();
sect.pop();
assertThrows(NoSuchElementException.class, () -> sect.pop());
}

@Test
public void testPushPopAfterEmpty() {
sect.push(10);
sect.push(1);
sect.pop();
sect.pop();
sect.push(5);
assertEquals(5, sect.getMinimumElement());
sect.push(1);
assertEquals(1, sect.getMinimumElement());
}
}