package stack; import java.util.NoSuchElementException; import java.util.Stack; /** * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 * @author liuxin * */ public class QuickMinStack { Stack<Integer> s1 = new Stack<>(); private Stack<Integer> min = new Stack<>(); public void push(int data){ s1.push(data); if (size() == 0) { min.push(data); } else { Stack<Integer> temp = new Stack<Integer>(); while(!min.isEmpty() && data >min.peek()) { temp.push(min.pop()); } min.push(data); while(!temp.isEmpty()) { min.push(temp.pop()); } } } @Override public String toString() { return "QuickMinStack [s1=" + s1 + ", min=" + min + "]"; } public int pop(){ checkEmpty(); int result = s1.pop(); Stack<Integer> temp = new Stack<Integer>(); while(!min.isEmpty() && min.peek() != result) { temp.push(min.pop()); } min.pop(); while(!temp.isEmpty()) { min.push(temp.pop()); } return result; } private void checkEmpty() { if (size() <= 0) { throw new NoSuchElementException("stack is empty"); } } public int size() { return s1.size(); } public int findMin(){ return min.peek(); } }