package com.github.wdn.coding2017.basic.stack; import java.util.*; /** * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 * Created by Administrator on 2017/5/6 0006. */ public class QuickMinStack<E extends Comparable> { private Stack<E> stack = new Stack<>(); private Map<Integer, E> minIndexMap = new HashMap<>(); private List<Integer> minIndexs = new ArrayList<>(); public static void main(String[] args) { QuickMinStack quickMinStack = new QuickMinStack(); //int[] ints = {5,4,3,2,1,0}; int[] ints = {4,1,2,5,3,0}; for (int i = 0; i < ints.length; i++) { quickMinStack.push(ints[i]); } quickMinStack.status(); while (!quickMinStack.isEmpty()){ System.out.print("min:"+quickMinStack.findMin()); System.out.println(" pop:"+quickMinStack.pop()); } } public void push(E data){ stack.push(data); if(minIndexs.size()==0){ minIndexMap.put(0,data); minIndexs.add(0); }else { if(findMin().compareTo(data)>0){ minIndexMap.put(stack.size()-1,data); minIndexs.add(stack.size()-1); } } } public E pop(){ E min = findMin(); E result = stack.peek(); if(min==result){ minIndexMap.remove(minIndexs.get(minIndexs.size()-1)); minIndexs.remove(minIndexs.size()-1); } return stack.pop(); } public E findMin(){ return minIndexMap.get(minIndexs.get(minIndexs.size()-1)); } public boolean isEmpty(){ return stack.isEmpty(); } public void status(){ System.out.println(stack); System.out.println(minIndexs); System.out.println(minIndexMap); } }