您的位置:首页 > 其它

栈和队列之设计一个有getMin(得到最小值)功能的栈

2015-11-22 23:42 417 查看
有2中方案,分别用类和内部类实现了

import java.util.Stack;

/**
* @author chenyu 第一种设计:
* 题目:设计一个有getMin功能的栈,设计一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作
* 要求:1 pop push getMin操作的时间复杂度都是O(1)
* 2 设计的栈类型可以使用线程的栈结构
* 思路:压入数据规则:假设当前数据时value,先将其压入stackData,然后判断stackMin是否为空,
* 如果为空,则value压入stackMin
* 如果不能空,则比较value和stackMin中栈顶元素的哪一个更小
* 如果value更小或者两者相等,则将value也压入stackMin
* 如果value中栈顶元素小,则stackMin不压入任何内容,如下例子
* 1-------->1
* 2------->无
* 1-------->1
* 5-------->无
* 4-------->无
* 3-------->3
* 弹出数据规则:由压入数据规则可知,栈顶元素是最小的,先弹出stackData栈顶元素value,当value等于stackMin栈顶元素的时候,stackMin弹出数据
* 当value大于stackMin栈顶元素的时候,不弹出,返回value.
* 查询当前最小操作:由压入数据和弹出数据可知,栈顶元素,始终是stackData中的最小值,代码如下
*/
public class GetMinStack {
private Stack<Integer> statckData;
private Stack<Integer> stackMin;
public GetMinStack(){
statckData=new Stack<Integer>();
stackMin=new Stack<Integer>();
}
//压入数据
public void push(int value){
if(this.stackMin.isEmpty()){
this.stackMin.push(value);
}else if(value<=this.getMin()){
this.stackMin.push(value);
}
this.statckData.push(value);
}
//弹出数据
public int pop(){
if(this.stackMin.isEmpty()){
throw new RuntimeException("Your stack is empty");
}
int value=this.statckData.pop();
if(value==this.getMin()){
this.stackMin.pop();
}
return value;
}
//得到最小值
public int getMin(){
if(stackMin.isEmpty()){
throw new RuntimeException("Your stack is empty");
}
return this.stackMin.peek();
}
/**
* 第二种设计,压入的时候和前面一种不同的方式是,如果压入的数据比栈顶元素大,
* 我们依然压入栈顶元素,如下图
* 1------>1
* 2------>1
* 1------>1
* 5------>3
* 4------>3
* 3------>3
*/
public class GetMinStack2{
private Stack<Integer> statckData;
private Stack<Integer> stackMin;
public GetMinStack2(){
statckData=new Stack<Integer>();
stackMin=new Stack<Integer>();
}
//压入数据
public void push(int value){
if(this.stackMin.isEmpty()){
this.stackMin.push(value);
}else if(value<=this.getMin()){
this.stackMin.push(value);
}else{
int value1=getMin();
this.stackMin.push(value1);
}
this.statckData.push(value);
}
//弹出数据
public int pop(){
if(this.stackMin.isEmpty()){
throw new RuntimeException("Your stack is empty");
}
this.stackMin.pop();
return this.statckData.pop();
}
//得到最小值
public int getMin(){
if(stackMin.isEmpty()){
throw new RuntimeException("Your stack is empty");
}
return this.stackMin.peek();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: