版权声明:作者: 阿顾, 转载请写明出处, 谢谢 https://blog.csdn.net/u010452388/article/details/81665826
完整题目:
实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。
【要求】
1. pop(弹栈)、push(入栈)、getMin操作的时间复杂度都是O(1)
2. 设计的栈类型可以使用现成的栈结构
实现思路
1.首先准备两个栈,一个是data栈,一个是min栈
2.第一数入栈的时候,data栈和min栈都插入这个数,后面再有数入栈的时候,data栈正常入栈,入min栈的时候,拿当前数与min栈栈顶的数比较,较小的数入min栈
3.弹栈的时候,data栈和min栈同时弹出栈顶数据
4.通过getMin获取最小值的时候,直接返回min栈的栈顶数即可(但是不弹出)
图解流程
首先准备两个空栈,data栈和min栈,入第一个数的时候,两个数同时入栈,如下图:
入第二个数6的时候,data栈正常入栈,但是,6入min栈之前,先与min栈的栈顶数进行比较,哪个数小就入到min栈,比较后发现,min栈原来的数5小,那么直接入5
入第三个数3的时候,data栈正常入栈,3与min栈栈顶的5进行比较,3较小,则min栈入3
通过上面的步骤可以看出,每个阶段,min栈的栈顶数都是当前data栈的最小值,这样就可以保证getMin的时间复杂也为O(1)
注意:弹出数据的时候,data栈和min栈同时弹出即可
代码实现
import java.util.Stack;
public class GetMinStack {
//声明一个data栈
private Stack<Integer> dataStack;
//声明一个min栈
private Stack<Integer> minStack;
//无参构造函数
public GetMinStack() {
this.dataStack = new Stack<Integer>();
this.minStack = new Stack<Integer>();
}
//入栈
public void push(int num) {
//1.入栈有两种情况
//1.1 栈为空,那么第一个数直接进data栈和min栈
//1.2 栈不为空,data栈正常入,入min栈的时候,先与min栈的栈顶数据进行比较,小的数入min栈
if (dataStack.isEmpty()) {//栈为空
dataStack.push(num);
minStack.push(num);
} else {//栈不为空
dataStack.push(num);
if (num < minStack.peek()) {
minStack.push(num);
} else {
minStack.push(minStack.peek());
}
}
}
//弹栈
public Integer pop(){
//弹栈的时候,data栈和min栈一起弹出,如果栈为空,则先提醒用户
if(dataStack.isEmpty()){
throw new IllegalArgumentException("栈已空");
}
minStack.pop();
return dataStack.pop();
}
//取最小值
public Integer getMin(){
//直接获取最小栈的数据即可,如果栈为空,则先提醒用户
if(dataStack.isEmpty()){
throw new IllegalArgumentException("栈已空");
}
return minStack.peek();
}
}