您的位置:首页 > 运维架构

9.3栈和队列(三)——设计一个栈,出pop与push方法,还支持 min方法,可返回栈元素中的最小值

2015-08-04 15:22 357 查看
[align=left]/**[/align]
* 功能:设计一个栈,出pop与push方法,还支持
min方法,可返回栈元素中的最小值。三个方法的时间复杂度必须为O(1)。
[align=left] */[/align]

[align=left]两种方法:[/align]
[align=left]方法一:[/align]
/**
* 思路:每个结点记录当前最小值。
* 缺点:当栈很大时,每个元素都要记录 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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: