import java.util.Stack;
import java.util.Arrays;

public class Solution {

    
    private int   size     = 0;
    private int[] elements = new int[10];

    //辅助栈存最小值
    private Stack<Integer> stack = new Stack<>();
    private int            min   = Integer.MAX_VALUE;

    public void push(int node) {
        ensureCapacity(size + 1);
        elements[size++] = node;

        //处理最小值逻辑
        if (node < min) {
            min = node;
        }
        stack.push(min);
    }

    public void pop() {
        if (size > 0) {
            size--;

            //处理最小值逻辑
            Integer pop = stack.pop();
            if (!stack.isEmpty()) {
                min = stack.peek();
            }
        }
    }

    public int top() {
        if (!isEmpty()) {
            return elements[size - 1];
        }
        return 0;
    }

    public int min() {
        return min;
    }

    public boolean isEmpty() {
        return size == 0;
    }

    private void ensureCapacity(int newSize) {
        if (newSize > elements.length) {
            //要扩容
            elements = Arrays.copyOf(elements, (3 * elements.length) / 2 + 1);
        }
    }
}