package com.interview.algorithms.stackqueue; import com.interview.basics.model.collection.heap.BinaryArrayHeap; import com.interview.basics.model.collection.queue.Queue; /** * Created with IntelliJ IDEA. * User: stefanie * Date: 9/25/14 * Time: 4:53 PM * * Solution: * Use a Linked List to save the Queue, and Max Head Heap to track the max element * when push in, insert to tail and add to heap. * when pop out, delete from head, and set the value to null in the heap. * since delete element in heap is O(N). * when get max, getHead in the heap until the head value is not null. (head.value == null means the element is deleted) * */ public class C7_9_MaxQueueWithHeap<T extends Comparable<T>> implements Queue<T>{ private QueueNode<T> head; private QueueNode<T> tail; private int size; private BinaryArrayHeap<QueueNode<T>> heap = new BinaryArrayHeap<>(); class QueueNode<T extends Comparable<T>> implements Comparable<QueueNode<T>>{ T value; QueueNode<T> next; public QueueNode(T value){ this.value = value; } @Override public int compareTo(QueueNode<T> o) { return this.value.compareTo(o.value); } } @Override public void push(T item) { QueueNode<T> node = new QueueNode<>(item); heap.add(node); if(head == null){ head = tail = node; return; } else { tail.next = node; tail = node; } size++; } @Override public T pop() { if(head == null) return null; QueueNode<T> node = head; head = head.next; if(tail == node) tail = null; size--; //delete in the queue: just reset the node value to null T element = node.value; node.value = null; return element; } @Override public T peek() { if(head == null) return null; else return head.value; } @Override public boolean isEmpty() { return size == 0; } @Override public int size() { return size; } public T max(){ if(heap.getHead() == null) return null; //if node value == null, means this node is already deleted while(heap.getHead().value == null) heap.pollHead(); return heap.getHead().value; } }