I post the full code here to find min and mx on the stack. The complexity of time will be equal to O (1)
package com.java.util.collection.advance.datastructure;
/ ** * * @author vsinha * * / open abstract Stack interface {
public abstract void push(E element); public abstract E pop(); public abstract E peek(); public abstract int size(); public abstract boolean empty();
}
package com.java.util.collection.advance.datastructure;
@SuppressWarnings ("hiding") MinMaxStack public abstract interface expands stack {
public abstract int min(); public abstract int max();
}
package com.java.util.collection.advance.datastructure;
import java.util.Arrays;
/ ** * * @author vsinha * * @param * / The public class MyStack implements Stack {
private E[] elements =null; private int size = 0; private int top = -1; private final static int DEFAULT_INTIAL_CAPACITY = 10; public MyStack(){
}
package com.java.util.collection.advance.datastructure;
/ ** * The complexity of the time will be O (1) to find the min and max in the given stack. * @author vsinha * * / Public class MinMaxStackFinder extends MyStack implements MinMaxStack {
private MyStack<Integer> minStack; private MyStack<Integer> maxStack; public MinMaxStackFinder (int intialCapacity){ super(intialCapacity); minStack =new MyStack<Integer>(); maxStack =new MyStack<Integer>(); } public void push(Integer element) { // Current element is lesser or equal than min() value, Push the current element in min stack also. if(!minStack.empty()) { if(min() >= element) { minStack.push(element); } } else{ minStack.push(element); } // Current element is greater or equal than max() value, Push the current element in max stack also. if(!maxStack.empty()) { if(max() <= element) { maxStack.push(element); } } else{ maxStack.push(element); } super.push(element); } public Integer pop(){ Integer curr = super.pop(); if(curr !=null) { if(min() == curr) { minStack.pop(); } if(max() == curr){ maxStack.pop(); } } return curr; } @Override public int min() { return minStack.peek(); } @Override public int max() { return maxStack.peek(); } @Override public String toString() { return super.toString()+"\nMinMaxStackFinder [minStack=" + minStack + "\n maxStack=" + maxStack + "]" ; }
}
// Testing program
package com.java.util.collection.advance.datastructure;
import java.util.Random;
public class MinMaxStackFinderApp {
public static void main(String[] args) { MinMaxStack<Integer> stack =new MinMaxStackFinder(10); Random random =new Random(); for(int i =0; i< 10; i++){ stack.push(random.nextInt(100)); } System.out.println(stack); System.out.println("MAX :"+stack.max()); System.out.println("MIN :"+stack.min()); stack.pop(); stack.pop(); stack.pop(); stack.pop(); stack.pop(); System.out.println(stack); System.out.println("MAX :"+stack.max()); System.out.println("MIN :"+stack.min()); }
}
Exit:
MyStack [elements = [99, 76, 92, 49, 89, 88, 93, 33, 0, 30], size = 10, top = 9] MinMaxStackFinder [minStack = MyStack [elements = [99, 76, 49, 33 , 0, null, null, null, null, null], size = 5, top = 4] maxStack = MyStack [elements = [99, null, null, null, null, null, null, null, null, null], size = 1, top = 0]] MAX: 99 MIN: 0 MyStack [elements = [99, 76, 92, 49, 89, null, null, null, null, null], size = 5, top = 4] MinMaxStackFinder [minStack = MyStack [elements = [99, 76, 49, null, null, null, null, null, null, null], size = 3, top = 2] maxStack = MyStack [elements = [99, null, null, null, null, null, null, null, null, null], size = 1, top = 0]] MAX: 99 MIN: 49
Let me know if you have any problems.
Thank you, VIKASH SINHA