This should implement a stack that has a \$O(1)\$ getMin
method. I used an auxiliary stack. Please provide comments on my solution.
import org.junit.Test;
public class Solution {
@Test
public void testEmptyStack(){
StackMin<Integer> s = new StackMin<Integer>();
System.out.println("----------------------");
System.out.println("Empty stack");
System.out.println(s.getMin());
}
@Test
public void testRandomStack(){
System.out.println("----------------------");
StackMin<Integer> s = new StackMin<Integer>();
s.push(2);
s.push(-1);
s.push(0);
s.push(7);
s.push(22);
System.out.println("Random stack");
s.printStack();
System.out.println("Min element");
System.out.println(s.getMin());
}
@Test
public void testEqualities(){
System.out.println("----------------------");
StackMin<Integer> s = new StackMin<Integer>();
s.push(2);
s.push(-1);
s.push(0);
s.push(0);
s.push(0);
s.push(7);
s.push(22);
s.push(-1);
s.push(-1);
s.push(33);
System.out.println("Stack with equalities");
s.printStack();
System.out.println("Min element");
System.out.println(s.getMin());
}
public static void main(String[] args) {
Solution e = new Solution();
e.testEmptyStack();
e.testRandomStack();
e.testEqualities();
}
}
class NodeV2<T> {
private final T data;
private final NodeV2<T> next;
public NodeV2(T d, NodeV2<T> n) {
data = d;
next = n;
}
public NodeV2(T d) {
this(d, null);
}
public T getData() {
return data;
}
public NodeV2<T> getNext() {
return next;
}
}
class StackMin<T extends Comparable<T>> extends StackV2<T> {
StackV2<T> auxiliaryStack = new StackV2<T>();
void push(T element) {
if (auxiliaryStack.isEmpty() || element.compareTo(auxiliaryStack.top.getData()) <= 0) {
auxiliaryStack.push(element);
}
super.push(element);
}
T pop() {
if (this.peek().compareTo(auxiliaryStack.peek()) <= 0) {
auxiliaryStack.pop();
}
return super.pop();
}
public T getMin() {
return auxiliaryStack.peek();
}
}
class StackV2<T extends Comparable<T>> {
NodeV2<T> top;
void push(T element) {
NodeV2<T> t = new NodeV2<T>(element, top);
top = t;
}
T pop() {
if (top != null) {
T item = top.getData();
top = top.getNext();
return item;
}
return null;
}
T peek() {
return top == null ? null : top.getData();
}
boolean isEmpty() {
return top == null ? true : false;
}
public void printStack() {
NodeV2<T> current = top;
while (current != null) {
System.out.println(current.getData());
current = current.getNext();
}
}
}