实现一个具有能返回栈中最小元素的操作的特殊栈;时间O(1),空间O(n)

  • 思想:使用两个栈,
    一个栈用来保存当前栈中的元素(就是一个正常的栈)记为:dataStack;
    一个用于保存每一步的最小值,记为:minStack;

  • 数据压入规则:
    正常压入stackData中;
    stackMin为空,直接压入;非空,同stackMin栈顶比较,小于则压入;否则不需要压入;

  • 数据弹出规则:
    弹出stackData栈顶元素value
    将value同stackMin中的栈顶比较,若等于,则stackMin也要弹出栈顶元素;否则不需要弹出;
    得到整个栈结构的最小值:
    取stackMin的栈顶元素值;

/**
 * @Description https://www.nowcoder.com/practice/05e57ce2cd8e4a1eae8c3b0a7e9886be?tpId=101&tqId=33073&tPage=1&rp=1&ru=/ta/programmer-code-interview-guide&qru=/ta/programmer-code-interview-guide/question-ranking
 * 题目:实现一个特殊功能的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作
 * <p>
 * 时间复杂度: O(1)
 * 空间复杂度:O(n)
 * @author: Golden
 * @date: 2020/3/23
 */

public class GetMinStack {

    private Stack<Integer> dataStack = new Stack<>();
    private Stack<Integer> minStack = new Stack<>();

    //入栈
    public Integer push(Integer item) {
        dataStack.push(item);
        if (minStack.empty()) {
            minStack.push(item);
        } else {
            Integer top = minStack.peek();
            if (top > item) {
                //总是存储最小值
                minStack.push(item);
            }
        }
        return item;
    }

    //出栈
    public Integer pop() {
        Integer item = dataStack.pop();
        if (!minStack.isEmpty()) {
            Integer top = minStack.peek();
            if (item.equals(top)) {
                minStack.pop();
            }
        }
        return item;

    }


    //取栈顶
    public Integer peek() {
        return dataStack.peek();
    }


    //获取最小值
    public Integer getMin() {
        return minStack.isEmpty() ? null : minStack.peek();
    }


    @Test
    public void testDemo() {
        GetMinStack stack = new GetMinStack();
        stack.push(3);
        stack.push(2);
        stack.push(1);
        System.out.println(stack.getMin());
        stack.pop();
        System.out.println(stack.getMin());
    }


    public static void main(String[] args) throws IOException {
        GetMinStack stack = new GetMinStack();

        BufferedReader sc = new BufferedReader(new InputStreamReader(System.in));
        int row = Integer.parseInt(sc.readLine());
        for (int i = 0; i < row; i++) {
            String[] str = sc.readLine().split(" ");
            if ("push".equals(str[0])) {
                stack.push(Integer.valueOf(str[1]));
                continue;
            }
            if ("pop".equals(str[0])) {
                stack.pop();
                continue;
            }
            System.out.println(stack.getMin());
        }
    }


}