题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素, 要求函数min、push以及pop的时间复杂度都是O(1)。
本题对空间复杂度没有要求,故而可以添加一个辅助栈,每次push一个新元素的时候,同时将最小元素(或最小元素的位置。考虑到栈元素的类型可能是复杂的数据结构,用最小元素的位置将能减少空间消耗)push到辅助栈中;每次pop一个元素出栈的时候,同时pop辅助栈。
/**
* @Title: MinStack.java
* @Package stack
* @Description: TODO
* @author peidong
* @date 2017-5-3 上午9:11:39
* @version V1.0
*/
package stack;
import java.util.Stack;
public class MinStack<T> {
private Stack<T> data;
private Stack<T> minStack;
/**
*
* <p>Title: </p>
* <p>Description:构造函数
*/
public MinStack() {
data = new Stack();
minStack = new Stack();
}
/**
*
* @Title: min
* @Description: 返回栈顶元素,辅助栈,最小值
* @param @return
* @return T
* @throws
*/
public T min(){
return minStack.peek();
}
/**
*
* @Title: pop
* @Description: 弹出栈顶元素
* @param @return
* @return T
* @throws
*/
public T pop(){
minStack.pop();
return data.pop();
}
public void push(T t){
if(data.size() == 0){
minStack.push(t);
}else{
T minValue = min();
if(((Comparable)t).compareTo(minValue)<0)
minStack.push(t);
else
minStack.push(minValue);
}
data.push(t);
}
/**
* @Title: main
* @Description: 测试
* @param @param args
* @return void
* @throws
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
MinStack<Integer> ms = new MinStack<Integer>();
ms.push(4);
ms.push(3);
ms.push(5);
ms.push(2);
ms.push(1);
System.out.println("min:" + ms.min() + " pop:" +ms.pop() );
System.out.println("min:" + ms.min() + " pop:" +ms.pop() );
System.out.println("min:" + ms.min() + " pop:" +ms.pop() );
System.out.println("min:" + ms.min() + " pop:" +ms.pop() );
System.out.println("min:" + ms.min() + " pop:" +ms.pop() );
}
}