package com.aaront.exercise.basic; import java.util.Arrays; /** * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回该数据结构中的最小元素 * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 */ public class QuickMinStack { private static final int DEFAULT_LENGTH = 20; private Node[] nodes = new Node[DEFAULT_LENGTH]; private int size = 0; public void push(int data) { _ensureCapacityEnough(); if (size == 0) { Node node = new Node(data, data); nodes[size++] = node; } else { int min = nodes[size - 1].min; Node node = new Node(data, data > min ? min : data); nodes[size++] = node; } } public int pop() { if (size <= 0) throw new RuntimeException("栈为空"); return nodes[--size].data; } public int findMin() { return nodes[size - 1].min; } public int size() { return this.size; } private void _ensureCapacityEnough() { if (size >= nodes.length) { nodes = Arrays.copyOf(nodes, DEFAULT_LENGTH * 2); } } } class Node { int data; int min; public Node(int data, int min) { this.data = data; this.min = min; } }