维护两个栈,一个输入栈,一个辅助栈,辅助栈用于存储当前栈中的最小值。
因为pop一定是从栈顶出栈的,所以在辅助栈中后入栈的最小值影响不到先入栈的最小值。
出栈时,输入栈和辅助栈一起出,因为辅助栈栈顶的最小值是相对于输入栈栈顶而言的。

import java.util.*;
import java.util.Stack;
import java.util.ArrayList;

public class Solution {
    /**
     * return a array which include all ans for op3
     * @param op int整型二维数组 operator
     * @return int整型一维数组
     */
    Stack<Integer> stackA=new Stack<Integer>();
    Stack<Integer> stackMin=new Stack<Integer>();
    ArrayList<Integer> tmp = new ArrayList<>();

    public int[] getMinStack (int[][] op) {
        // write code here
        for(int[] arr : op){
            if(arr[0]==1){
                push(arr[1]);
            }
            else if(arr[0]==2){
                pop();
            }
            else{
                int min=getMin();
                tmp.add(min);
            }
        }
        int[] result=new int[tmp.size()];
        for(int i=0;i<result.length;i++){
            result[i]=tmp.get(i);
        }
        return result;
    }

    public void push(int value){
        stackA.push(value);
        if(stackMin.isEmpty()){
            stackMin.push(value);
        }
        else{
            stackMin.push(stackMin.peek()>=value ? value : stackMin.peek());
        }
    }

    public void pop(){
        stackA.pop();
        stackMin.pop();
    }

    public int getMin(){
        return stackMin.peek();
    }
}