包含min函数的栈

一、题目描述

定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。

二、解题思路 

2.1 核心步骤

  把每次的最小元素(之前的最小元素和新压入栈的元素两者的较小值)都保存起来放到另外一个辅助栈里。下图展示了栈内压入3、4、2、1之后接连两次弹出栈顶数字再压入0时,数据栈、辅助栈和最小值的状态。

包含min函数的栈

从表中我们可以看出,如果每次都把最小元素压入辅助栈,那么就能保证辅助栈的栈顶一直都是最小元素。 

2.2 代码实现

import java.util.Stack;

public class Solution {

    // 数据栈
	Stack<Integer> dataStack = new Stack<Integer>();//存放元素栈
    // 辅助栈
	Stack<Integer> minStack = new Stack<Integer>();//辅助栈,data栈中每次进入一个元素,min辅助栈就存放当前data栈中的最小元素

///每次压入数据栈数据与最小数据进行比较,如果更小,存入数据栈同时,存入辅助栈,并且最小值设置为该数据
    public void push(int node) {
        dataStack.push(node);//dataStack栈进入元素
        if(minStack.isEmpty()||node<minStack.peek()){
            minStack.push(node);
        }else{minStack.push(minStack.peek());}
    }
    
    //dataStack和minStack弹出元素
    public void pop() {
        if(dataStack.size()>0&&minStack.size()>0){
            dataStack.pop();
            minStack.pop();
        }
    }
    //data栈的栈顶元素
    public int top() {// 方法的定义需要有返回函数
        if(dataStack.size()>0){
             return dataStack.peek();
        }
        return 0;
    }
    
    public int min() {
        if(minStack.size()>0){
             return minStack.peek();//得到元素,不需要弹出
        }
        return 0;
    }
}

注意:

何时需要写返回值

 //dataStack和minStack弹出元素
    public void pop() {
        if(dataStack.size()>0&&minStack.size()>0){
            dataStack.pop();
            minStack.pop();
        }
    }
    //data栈的栈顶元素
    public int top() {// 方法的定义需要有返回函数
        if(dataStack.size()>0){
             return dataStack.peek();
        }
        return 0;

    }

参考:https://www.cnblogs.com/edisonchou/p/4777459.html