题目描述

定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。

 

题目链接:

https://www.nowcoder.com/practice/4c776177d2c04c2494f2555c9fcc1e49?tpId=13&tqId=11173&rp=1&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking

 

分析:

利用栈的先进后出特性,先进去的元素会后出来,用一个辅助栈来存储当前最小的值。

实现:

每当压入主栈时,判断压入的元素是否不大于辅助栈顶值,是则压入,否则不作处理。

 

 

import java.util.Stack;

public class Solution {

    private Stack<Integer> s1=new Stack<>();
    private Stack<Integer> s2=new Stack<>();
    //关键实现:利用栈的先进后出特性,先进去的元素会后出,所以较小值可以用一个辅助栈存储
    //当新来值不大于之前先进去的最小值时,就将该数值压入辅助栈。注意相等情况也需要压入栈。
    public void push(int node) {
        s1.push(node);
        if(s2.empty()||node<=s2.peek()){
            s2.push(node);
        }
    }
    //出栈时,同时判断辅助栈s2是否需要出栈
    public void pop() {
        int a =s1.peek();
        if(a == s2.peek()){
            s2.pop();
        }
        s1.pop();
    }
    
    public int top() {
        return s1.peek();
    }
    
    public int min() {
        return s2.peek();
    }
}