/**
* 功能:设计一个栈,出pop与push方法,还支持
min方法,可返回栈元素中的最小值。三个方法的时间复杂度必须为O(1)。
*/
两种方法:
方法一:
/**
* 思路:每个结点记录当前最小值。
* 缺点:当栈很大时,每个元素都要记录 min,就会浪费大量空间。
*/
public class StackWithMin extends Stack<NodeWithMin>{
public static void main(String[] args) {
// TODO Auto-generated method stub
}
public void push(int value){
int newMin=Math. min(value , min());
super.push( new NodeWithMin( value, newMin));
}
public int min(){
if( this.isEmpty())
return Integer. MAX_VALUE;
else
return peek(). min;
}
}
class NodeWithMin{
public int value;
public int min;
public NodeWithMin( int value, int min){
this. value= value;
this. min= min;
}
}
方法二:
/**
* 思路:利用额外的栈来记录 min
*/
public class StackWithMin2 extends Stack<Integer>{
public static void main(String[] args) {
// TODO Auto-generated method stub
}
//s2是存放最小值的栈
Stack<Integer> sMin;
public StackWithMin2(){
sMin= new Stack<Integer>();
}
public void push(int value){
if( value<=min())
sMin.push( value); //调用自身Stack的Push方法,而不是StackWithMin2的方法(sMin是Stack类)
super.push( value);
}
public Integer pop(){
int value= super.pop();
if( value==min())
sMin.pop();
return value;
}
public int min(){
if( sMin.isEmpty())
return Integer. MAX_VALUE;
return sMin.peek();
}
}