Java算法(02) -- 最小栈的实现

1、题目分析

实现一个栈,该栈带有出栈(pop)、入栈(push)、取最小元素(getMin)3 个方法,保证这3个方法的时间复杂度都是O(1)。
在这里插入图片描述

方法一【错误】

方法流程:

  • 创建一个整型变量min,用来存储栈中的最小元素;当第1个元素进栈时, 把进栈元素赋值给min,即把栈中唯一的元素当做最小值
    -
  • 之后每当一个新元素进栈,就让新元素和min比较大小。如果新元素小于min,则min等于新进栈的元素;如果新元素大于或等于min,则不做改变;
    在这里插入图片描述
  • 当调用getMin方法时,直接返回min的值即可

错误分析:【只考虑了进栈场景,却没有考虑出栈场景】

  • 栈中最小的元素是3,min变量记录的值也是3
    在这里插入图片描述
  • 栈顶元素出栈
    在这里插入图片描述
    虽然此时的最小元素是4,但是程序并不知道

方法二【正确】

解法步骤:

  • 设原有的栈叫作栈A,此时创建一个额外的“备胎”栈B,用于辅助栈A
    在这里插入图片描述
  • 当第1个元素进入栈A时,让新元素也进入栈B。这个唯一的元素是栈A的当 前最小值
    在这里插入图片描述
  • 每当新元素进入栈A时,比较新元素和栈A当前最小值的大小,如果小于栈A当前最小值,则让新元素进入栈B,此时栈B的栈顶元素就是栈A当前最小值
    在这里插入图片描述
  • 每当栈A有元素出栈时,如果出栈元素是栈A当前最小值,则让栈B的栈顶元素也出栈;此时栈B余下的栈顶元素所指向的是栈A当中原本第2小的元素,代替刚才的出栈元素成为栈A的当前最小值(备胎转正)
    在这里插入图片描述
    当调用getMin方法时,返回栈B的栈顶所存储的值,这也是栈A的最小值。

这个解法中进栈、出栈、取最小值的时间复杂度都是O(1),最坏情况空间复杂度是O(n)

2、代码实现

Code:

import java.util.Stack;
/**
 * @ClassName minStack
 * @Description //最小栈的实现
 * @Date: 2020/4/8
 * @Version 1.0
 */
public class minStack {
    private Stack<Integer> mainStack = new Stack<Integer>();
    private Stack<Integer> minStack = new Stack<Integer>();
    /**
     *  入栈操作
     * @param element  入栈的元素
     */
    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{
        minStack stack = new minStack();
        stack.push(4);
        stack.push(9);
        stack.push(7);
        stack.push(3);
        stack.push(8);
        stack.push(5);
        System.out.println("当前栈中的最小元素为:"+ stack.getMin());
        stack.pop();
        stack.pop();
        stack.pop();
        System.out.println("当前栈中的最小元素为:"+ stack.getMin());
    }
}

编译输出:
在这里插入图片描述
———————————————————————————————————————
内容来源:《漫画算法》
关注公众号,回复 【算法】,获取高清算法书!
在这里插入图片描述

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