最小栈

设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。

push(x) -- 将元素 x 推入栈中。

pop() -- 删除栈顶的元素。

top() -- 获取栈顶元素。

getMin() -- 检索栈中的最小元素。

示例:

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.getMin();   --> 返回 -2.
package datastructure.stack;

public class FireMinStack {

    private FireStack data;
    private FireStack minIndex;

    public FireMinStack(){
        data = new FireStack();
        minIndex = new FireStack();
    }

    public int Size(){
        return data.getSize();
    }

    public boolean isEmpty(){
        return data.isEmpty();
    }

    public void push(Integer element){
        if (data.isEmpty()){
            minIndex.push(element);
        }else if(element < minIndex.top()){
            minIndex.push(element);
        }
        data.push(element);
    }

    public Integer pop(){
        int item = data.pop();
        if (item == minIndex.top()){
            minIndex.pop();
        }
        return item;
    }

    public Integer top(){
        return data.top();
    }

    public Integer getMin(){
        if(minIndex.isEmpty()){
            throw new RuntimeException("no min");
        }
        return minIndex.top();
    }

    public static void main(String[] args) {
        FireMinStack fireMinStack = new FireMinStack();
        fireMinStack.push(-2);
        fireMinStack.push(0);
        fireMinStack.push(-3);
        System.out.println(fireMinStack.getMin());
        fireMinStack.pop();
        System.out.println(fireMinStack.top());
        System.out.println(fireMinStack.getMin());
    }
}

可能得变种

ginMin() 取出最小的元素而不是检索最小的元素