实现一个栈,要求pop push getMin的时间复杂度都是O(1)【图解流程】

完整题目:

实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。

【要求】

1. pop(弹栈)、push(入栈)、getMin操作的时间复杂度都是O(1)

2. 设计的栈类型可以使用现成的栈结构

实现思路

1.首先准备两个栈,一个是data栈,一个是min栈

2.第一数入栈的时候,data栈和min栈都插入这个数,后面再有数入栈的时候,data栈正常入栈,入min栈的时候,拿当前数与min栈栈顶的数比较,较小的数入min栈

3.弹栈的时候,data栈和min栈同时弹出栈顶数据

4.通过getMin获取最小值的时候,直接返回min栈的栈顶数即可(但是不弹出)

图解流程

首先准备两个空栈,data栈和min栈,入第一个数的时候,两个数同时入栈,如下图:

《实现一个栈,要求pop push getMin的时间复杂度都是O(1)【图解流程】》

入第二个数6的时候,data栈正常入栈,但是,6入min栈之前,先与min栈的栈顶数进行比较,哪个数小就入到min栈,比较后发现,min栈原来的数5小,那么直接入5

《实现一个栈,要求pop push getMin的时间复杂度都是O(1)【图解流程】》

 入第三个数3的时候,data栈正常入栈,3与min栈栈顶的5进行比较,3较小,则min栈入3

《实现一个栈,要求pop push getMin的时间复杂度都是O(1)【图解流程】》

通过上面的步骤可以看出,每个阶段,min栈的栈顶数都是当前data栈的最小值,这样就可以保证getMin的时间复杂也为O(1)

注意:弹出数据的时候,data栈和min栈同时弹出即可

代码实现


import java.util.Stack;

public class GetMinStack {
    //声明一个data栈
    private Stack<Integer> dataStack;
    //声明一个min栈
    private Stack<Integer> minStack;

    //无参构造函数
    public GetMinStack() {
        this.dataStack = new Stack<Integer>();
        this.minStack = new Stack<Integer>();
    }

    //入栈
    public void push(int num) {
        //1.入栈有两种情况
        //1.1 栈为空,那么第一个数直接进data栈和min栈
        //1.2 栈不为空,data栈正常入,入min栈的时候,先与min栈的栈顶数据进行比较,小的数入min栈
        if (dataStack.isEmpty()) {//栈为空
            dataStack.push(num);
            minStack.push(num);
        } else {//栈不为空
            dataStack.push(num);
            if (num < minStack.peek()) {
                minStack.push(num);
            } else {
                minStack.push(minStack.peek());
            }
        }
    }
    //弹栈
    public Integer pop(){
        //弹栈的时候,data栈和min栈一起弹出,如果栈为空,则先提醒用户
        if(dataStack.isEmpty()){
            throw new IllegalArgumentException("栈已空");
        }
        minStack.pop();
        return dataStack.pop();
    }
    //取最小值
    public Integer getMin(){
        //直接获取最小栈的数据即可,如果栈为空,则先提醒用户
        if(dataStack.isEmpty()){
            throw new IllegalArgumentException("栈已空");
        }
        return minStack.peek();
    }
}

 

点赞