<剑指offer> 第18题

题目:

定义栈的数据结构,在该类型中实现一个能够找到栈的最小数的min函数,在该栈中,调用min,push,pop的时间复杂度都是O(1)

思路:

把每次的最小元素(之前的最小元素和新压入栈的元素两者的较小值)都保存起来放到另外一个辅助栈里。

如果每次都把最小元素压入辅助栈,那么就能保存辅助栈的栈顶一直都是最小元素,当最小元素从数据栈内被弹出之后,同时弹出辅助栈的栈顶元素,此时辅助栈的新栈顶元素就是下一个最小值

代码实现:

import java.util.Stack;

public class Eighteenth {
    private Stack<Integer> stack = new Stack<>();
    private Stack<Integer> minStack = new Stack<>();
    
    public void push(int data){
        stack.push(data);
        if(minStack.size() == 0 || data < minStack.peek()){
            minStack.push(data);
        }else{
            minStack.push(minStack.peek());
        }
    }
    
    public int pop() throws Exception{
        if(stack.size() == 0){
            throw new Exception("栈已为空");
        }
        int data = stack.pop();
        minStack.pop();
        return data;
    }
    
    public int min() throws Exception{
        if(stack.size() == 0){
            throw new Exception("栈已为空");
        }
        return minStack.peek();
    }
}

猜你喜欢

转载自www.cnblogs.com/HarSong13/p/11330712.html