您的位置:首页 > 其它

设计一个有getMin功能的栈

2017-02-26 11:43 351 查看

设计一个有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();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: