设计一个有getMin功能的栈
【题目】
实现一个特殊的栈,在实现基本的栈功能的基础上,再实现返回栈中最小元素的操作
【要求】
- pop、push、getMin的操作时间复杂度都是O(1)
- 设计的栈类型可以使用现成的栈结构
【解决思路】
在设计上,我们使用两个栈来解决问题,使用空间换取时间复杂度上的最优解。一个栈用来存储我们当前栈中最小的元素;另外的一个栈用来实现我们的基本栈的操作,存储基本数据。
- 数据压栈规则
假设,当前要压入栈的数据为newNum,先将其压入到stackData.然后判断stackMin是否为空:
1.如果为空:则将newNum压入到minStack
2.如果不为空,则将newNum和minStack栈顶的数据进行比较,如果比它小,则把newNum压入到minStack中去 - 数据出栈规则
先从stackData中执行出栈操作,取出数据,然后将这个数据和当前最小数据进行比较,如果当前出栈的数据是当前最小数据,则在minStack也进行出栈即可。
【代码实现】
package study0224;
import java.util.Stack;
public class MyStrack1 {
private Stack<Integer> strackData;
private Stack<Integer> minData;
public MyStrack1() {
this.strackData = new Stack<Integer>();
this.minData = new Stack<Integer>();
}
public void push(Integer newNum) {
if (strackData.isEmpty()) {
strackData.push(newNum);
minData.push(newNum);
} else {
strackData.push(newNum);
if (this.getMin() > newNum) {
minData.push(newNum);
}
}
}
public int pop() {
int popNum = strackData.pop();
if(popNum == this.getMin()) {
minData.pop();
}
return popNum;
}
public int getMin() {
if (this.minData.isEmpty()) {
throw new RuntimeException("min stack is null");
}
return minData.peek();
}
}