最小栈

题目链接:

涉及知识:

题目要求:通过已学的数据结构实现一个最小栈,可以实现 push、pop、top 和 getMin ,分别表示入栈、出栈、返回栈顶元素和返回当前栈中元素的最小值。并且要求 getMin 方法的时间复杂度为常数时间。

实现思路:使用两个栈来实现。

  • 数据栈:按入栈的顺序保存元素。
  • 辅助栈:只保存比当前栈顶元素小的元素。(初始状态栈为空保存第一个元素)
  • 在出栈时,当数据栈直接出栈,辅助栈当且仅当弹出的数据栈的元素的值等于栈顶元素的值的时候才出栈。

为什么辅助栈入栈的时候要小于等于?

小于等于是因为可能连续入栈的多个元素相等,且是最小的,如果辅助栈中只保存一份,那么当数据栈出栈的时候,弹出若干个相等元素中的一个时,便将辅助栈中保存的值弹出,出错。

代码实现:

import java.util.Stack;

/*
 * @lc app=leetcode.cn id=155 lang=java
 *
 * [155] 最小栈
 */
class MinStack {
    Stack<Integer> s1 = null;
    Stack<Integer> s2 = null;

    /** 
     * initialize your data structure here. 
     * 使用两个栈保存数据,s1 按插入顺序保存,s2 永远保存比栈顶小的元素 
     * */
    public MinStack() {
        s1 = new Stack<>();
        s2 = new Stack<>();
    }
    
    /**
     * 添加元素
     * @param x
     */
    public void push(int x) {
        s1.push(x);
        
        //s2 为空或者 x 小于等于 s2 的栈顶元素
        if(s2.empty() || x <= s2.peek()){
            s2.push(x);
        }
    }
    
    /**
     * 弹出元素
     */
    public void pop() {
        if(!s1.empty()){
            int tmp = s1.peek();
            s1.pop();

            //如果 s1 将最小值弹出,则 s2 也需要同时将该值弹出
            if(tmp == s2.peek()){
                s2.pop();
            }
        }
    }
    
    /**
     * 获取栈顶元素,但不删除
     * @return
     */
    public int top() {
        return s1.peek();
    }
    
    /**
     * 返回栈中的最小值
     * @return
     */
    public int getMin() {
        return s2.peek();
    }
}

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack obj = new MinStack();
 * obj.push(x);
 * obj.pop();
 * int param_3 = obj.top();
 * int param_4 = obj.getMin();
 */
posted @ 2019-08-22 11:18  telankesi  阅读(173)  评论(0编辑  收藏  举报