要求:实现一个带有取最小值min方法的栈,min方法将返回当前栈中的最小值。你实现的栈将支持push,pop 和 min 操作,所有操作要求都在O(1)时间内完成。
注意事项:如果堆栈中没有数字则不能进行min方法的调用。
样例:如下操作:push(1),pop(),push(2),push(3),min(), push(1),min() 返回 1,2,1
思路:我们使用两个stack栈来操作,一个保存数据,一个保存最小值(找到相等的和更小的就加进去),值得注意的是,没有元素的时候,无论第一个压进栈的元素是多大,最小值的堆栈都要压进去,出栈的时候如果只剩下一个元素,也是要特殊处理的。
代码如下:
public class MinStack {
public Stack<Integer> data=new Stack<>();//保存数据的栈
public Stack<Integer>min=new Stack<>();//保存最小值得栈
public MinStack() {
// do initialize if necessary
}
public void push(int number) {//压栈操作
// write your code here
data.push(number);
if(min.size()==0||min.lastElement()>=number){//当该数小于最小值的时候,或者堆栈里面没有数的时候,我们将它压进去。
min.push(number);
}
}
public int pop() {
// write your code here
if(data.size()>0){//数据栈大小不为0
int t=data.lastElement();//得到最小值
if(data.size()==1) {//只剩下一个元素,数据栈要出栈,最小值也是
data.pop();
min.pop();
}else{
data.pop();数据栈出栈
if(min.lastElement()==t){//最小值不一定要出栈
min.pop();
}
}
return t;
}else//数据栈为空
return 0;
}
public int min() {
// write your code here
if(min.size()>0&&data.size()>0)
return min.lastElement();
else
return 0;
}
}
如果有所帮助,脸皮厚求个赞~
此文章仅代表自己(本菜鸟)学习积累记录,或者学习笔记,如有侵权,请联系作者删除。人无完人,文章也一样,文笔稚嫩,在下不才,勿喷,如果有错误之处,还望指出,感激不尽~
技术之路不在一时,山高水长,纵使缓慢,驰而不息。
公众号:秦怀杂货店