MinStack es un problema que busca que crees tu propia stack en la cual las operaciones sean de O(1) todas. Cuatro operaciones principales.
push. Agregar un elemento al tope de la pila
pop. Remover el elemento al tope de la pila
top. Traer el elemento al tope de la pila
min. Traer el elemento minimo de la pila.
Para implementarlo existen dos caminos viables, el facil que es utilizando la estructura Stack que ya se incluye en la libreria estandar de los lenguajes. La otra es utilizar arrays y punteros para mantener en track el indice del ultimo elemento agregado.
Yo personalmente me decante por esta ultima, por tanto, mantuve dos arrays, uno para los datos y otro para los valores minimos en dado momento, adicionalmente, un puntero para mantener en track el ultimo indice y una variable para guardar el valor minimo en dado momento.
classMinStack{Â Â privateintlatestElementIndex;Â Â privateint[]elements;Â Â privateint[]mins;Â Â privateintminTracker;Â Â publicMinStack(){Â Â Â Â this.elements=newint[30000];Â Â Â Â this.mins=newint[30000];Â Â Â Â this.latestElementIndex=-1;Â Â Â Â this.minTracker=Integer.MAX_VALUE;Â Â }Â Â publicvoidpush(intval){Â Â Â Â latestElementIndex++;Â Â Â Â if(val<minTracker){Â Â Â Â Â Â minTracker=val;Â Â Â Â Â Â this.mins[latestElementIndex]=val;Â Â Â Â }else{Â Â Â Â Â Â this.mins[latestElementIndex]=minTracker;Â Â Â Â }Â Â Â Â elements[latestElementIndex]=val;Â Â }Â Â publicvoidpop(){Â Â Â Â mins[latestElementIndex]=0;Â Â Â Â elements[latestElementIndex]=0;Â Â Â Â latestElementIndex--;Â Â Â Â if(latestElementIndex<0){Â Â Â Â Â Â minTracker=Integer.MAX_VALUE;Â Â Â Â }else{Â Â Â Â Â Â minTracker=mins[latestElementIndex];Â Â Â Â }Â Â }Â Â publicinttop(){Â Â Â Â if(latestElementIndex<0){Â Â Â Â Â Â return0;Â Â Â Â }Â Â Â Â returnelements[latestElementIndex];Â Â }Â Â publicintgetMin(){Â Â Â Â if(latestElementIndex<0){Â Â Â Â Â Â return0;Â Â Â Â }Â Â Â Â returnmins[latestElementIndex];Â Â }}