面试中的算法
题目
实现一个栈,该栈带有出栈,入栈,取得最小元素3个方法,保证3个方法的时间复杂度最小为O(1)
方法:
1.设原有栈为栈A,再创建一个额外的栈B,当第一个元素入栈A时,也入栈B,作为栈A当前的最小值
2.每次入栈A时,比较新元素和栈A当前的最小值,如果小则让新元素入栈B,作为新的最小值
3.每次出栈时,如果出栈元素时栈A当前最小值,则让栈B的栈顶元素也出栈,此时栈A当中原本第二小的元素代替出栈元素成为了当前最小值
4.当调用getMin方法时,返回栈B的栈顶值,这也就是栈A的当前最小值
代码
private Stack<Integer> mainStack = new Stack<Integer>();
private Stack<Integer> minStack = new Stack<Integer>();
public void push(int element)
{
mainStack.push(element);
if(minStack.empty() || element <= minStack.peek())
{
minStack.push(element);
}
}
public Integer pop()
{
if(mainStack.peek().equals(minStack.peek()))
{
minStack.pop();
}
return mainStack.pop();
}
public int getMain() throws Exception
{
if(mainStack.empty())
{
throw new Exception("stack is empty");
}
return minStack.peek();
}