package com.interview.algorithms.stackqueue; import com.interview.basics.model.collection.queue.Queue; import java.util.Stack; /** * Created_By: stefanie * Date: 14-9-26 * Time: 上午10:12 */ public class C7_9_MaxQueueWithStack<T extends Comparable<T>> implements Queue<T> { class MaxStack<T extends Comparable<T>> extends Stack<T>{ private Stack<T> maxStack = new Stack<>(); T max; @Override public T push(T item) { super.push(item); if(max == null || item.compareTo(max) > 0) { maxStack.push(item); max = item; } else maxStack.push(max); return item; } @Override public synchronized T pop() { T element = super.pop(); maxStack.pop(); return element; } public T max(){ if(maxStack.empty()) return null; else return maxStack.peek(); } } private MaxStack<T> aStack = new MaxStack<>(); private MaxStack<T> bStack = new MaxStack<>(); @Override public void push(T item) { aStack.push(item); } private void move(){ while(!aStack.empty()){ bStack.push(aStack.pop()); } } @Override public T pop() { if(bStack.empty()) move(); return bStack.pop(); } @Override public T peek() { if(bStack.empty()) move(); return bStack.peek(); } @Override public boolean isEmpty() { return aStack.isEmpty() && bStack.isEmpty(); } @Override public int size() { return aStack.size() + bStack.size(); } public T max(){ T aMax = aStack.max(); T bMax = bStack.max(); if(aMax == null && bMax == null) return null; else if(aMax != null && (bMax == null || aMax.compareTo(bMax) > 0)) return aMax; else return bMax; } }