算法(二):实现一个getMin功能的栈

Posted by Lian YuTao on 2016-09-10

题目:
在Stack的基础上实现一个可以获得Stack的最小元素的方法(getMin),要求pop,push,getMin操作的时间复杂度是o(1)

题目来源《程序员代码面试指南》作者:左程云

0.分析

题目要求时间复杂度为o(1),即可以直接获得Stack的最小元素,我们可以使用两个栈,一个栈(StackData)存储全部元素,一个栈(StackMin)来存储最小元素(其实不是一个最小元素,应该是比第一个压入StackData栈的小的所有元素),getMin即获得StackMin栈的栈顶元素,需要注意的就是在push和pop时都需要和StackMin栈的栈顶做比较,如果出栈的数据与StackMin栈顶元素相同那么StackMin也需要pop数据。
如图

1.代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import java.util.Stack;
public class MinSatck {
private Stack<Integer> stackData;
private Stack<Integer> stackMin;
public MinSatck() {
this.stackData = new Stack<>();
this.stackMin = new Stack<>();
}
public void push(int item){
if (stackMin.isEmpty()) {
stackMin.push(item);
}else if (item <= getMin()) {
stackMin.push(item);
}
stackData.push(item);
}
public int pop(){
if (stackData.isEmpty()) {
throw new RuntimeException("stack is empty");
}else{
int value = stackData.pop();
if (value == getMin()) {
stackMin.pop();
}
return value;
}
}
public int getMin(){
if (stackMin.isEmpty()) {
throw new RuntimeException("stack is empty");
}
return stackMin.peek();
}
}