题目:
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.
- push(x) -- Push element x onto stack.
- pop() -- Removes the element on top of the stack.
- top() -- Get the top element.
- getMin() -- Retrieve the minimum element in the stack.
题意:
就是用一个栈来实现push,pop,top和搜索栈中的最小元素。
一开始拿到这个题,LZ觉得很简单啊,就是普通的栈操作,其实这道题的难点在于求这个栈的最小元素。因为普通的栈没有一个指针依次指向后一个,所以只能通过top来求这个栈的最小值,那么这时候就得考虑单独另设一个专门用来存储最小值的栈。即当每一次将一个元素压栈的时候,都先判断一下这个要压栈的元素与最小值栈中的头节点元素的值进行比较,如果这个值比最小值栈中的头节点的值要小于或等于,则也将其压入最小值栈中;那么在出栈的时候,需要和原来的那个栈的出栈元素比较,如果最小值栈的栈顶元素和原来那个栈的栈顶元素一致,那么同时将最小值栈的栈顶元素和原来栈的栈顶元素压出栈,这样可以确保最小值栈和原来栈的元素的同步。这里的最小值栈是一个妙用。
class MinStack
{
Stack<Integer> stack = new Stack<Integer>();
Stack<Integer> min_stack = new Stack<Integer>();
public void push(int x)
{
stack.push(x);
if(min_stack.isEmpty() || x <= min_stack.peek())
min_stack.push(x);
}
public void pop()
{
//int current = stack.pop();
if(stack.peek().equals(min_stack.peek())) //这里要用equals方法,而不能简单的用==,因为对于stack的peek元素是基本类型,所以要用equals方法,否则比较的是空间的地址,而非内容。
min_stack.pop();
stack.pop();
}
public int top()
{
//if(!stack.isEmpty())
return stack.peek();
}
public int getMin()
{
//if(!min_stack.isEmpty())
return min_stack.peek();
}
}