1、题目:
题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。
分析:这是google的一道面试题。我们需要一个辅助栈。每次push一个新元素的时候,同时将最小元素(或最小元素的位置。考虑到栈元素的类型可能是复杂的数据结构,用最小元素的位置将能减少空间消耗)push到辅助栈中;而每次pop一个元素出栈的时候,同时pop辅助栈
1、为了让设计的栈具有一般性,这里定义了一个抽象类:StackTemplate
2、通过MyStack具体实现特定的数据类型
Java代码实现如下
import java.util.LinkedList;
import java.util.List;
public abstract class StackTemplate<T> {
private List<T> data;
private List<T> viceData;
private int head;
private T minValue;
public StackTemplate(){
data = new LinkedList<>();
viceData = new LinkedList<>();
head = -1;
}
public void push(T value){
data.add(value);
T minData;
if(viceData.size()>0 && head>0) {
minData = getMinValue(value,viceData.get(head));
viceData.add(minData);
}else {
viceData.add(value);
}
head++;
}
public T pop(){
T value = data.remove(head);
viceData.remove(head);
head--;
return value;
}
public T peek(){
return data.get(head);
}
public T getMinValueInStack(){
return viceData.get(head);
}
public abstract T getMinValue(T value1,T value2);
}
public class MyStack extends StackTemplate<Integer> {
@Override
public Integer getMinValue(Integer value1, Integer value2) {
return Math.min(value1,value2);
}
}
import org.junit.Test;
public class StackTest {
@Test
public void test1(){
MyStack myStack = new MyStack();
myStack.push(9);
myStack.push(10);
myStack.push(8);
myStack.push(6);
myStack.push(26);
myStack.push(50);
System.out.println(myStack.getMinValueInStack());
myStack.pop();
myStack.pop();
myStack.pop();
System.out.println(myStack.getMinValueInStack());
}
}
输出
6
8