最小栈的实现

       题目:
       实现一个栈,该栈带有出栈,入栈,取最小元素3个方法,要保证3个方法的时间复杂度都是O(1);

       解题思路:
       1.设原有的栈叫做栈A,此时额外创建一个栈B,用于辅助栈A
       2.当第一个元素进入栈A时,让新元素也进入栈B,这个唯一的元素就是栈A的当前最小值
       3.之后,每当新元素进入栈A时,比较新元素和栈A当前最小值的大小,如果小于栈A当前最小值,则让新元素进入栈B,此时栈B的栈顶元素就是栈A当前最小值
       每当栈A有元素出栈时,如果出栈元素时站A当前最小值,则让栈B的栈顶元素也出栈,此时栈B余下的栈顶元素所指向的,是栈A当中原本第2 小的元素,代替刚才的出栈元素称为栈A当前最小值
       5.当调用getMin方法的时候,返回栈B的栈顶所存储的值,这也是栈A的最小值。

import java.util.Stack;

public class getMinStack {
    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 getMin() throws Exception{
        if(mainStack.empty()){
            throw new Exception("stack is empty");
        }
        return minStack.peek();
    }

    public static void main(String[] args) throws Exception{
        getMinStack stack = new getMinStack();
        stack.push(4);
        stack.push(9);
        stack.push(7);
        stack.push(3);
        stack.push(8);
        System.out.println(stack.getMin());
        stack.pop();
        stack.pop();
        System.out.println(stack.getMin());
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章