// implement a priority queue using a linked list
// first item on list is the highest priority item

class PQAsListAlt implements SeqStructure{

    private ListNode list;
    int size = 0;
    // two cursors:
    private ListNode current;
    private ListNode previous;
    
    public PQAsListAlt() { }
    
    // helper method, not part of interface
    // linear search
    private void scan(PQElement pin) {
	current = list;
	previous = null;
	if (size == 0) return;
	
	// scan PQ till you find 
	while (current != null && pin.compareTo(current.getItem()) <= 0){
	    previous = current;
	    current = current.getNext();
	}
    }
    
    
    public void put(Object pin) {
	PQElement p = (PQElement)pin;
	scan(p);
	if (previous == null) // make pin the first element
	    list = new ListNode(pin, list);
	else 
	    previous.setNext(new ListNode(pin,current));
	size = size + 1;
    }
    
    public Object get() { // remove and return head of list l
	if (size != 0){
	    Object o = list.getItem();
	    list = list.getNext();
	    size = size - 1;
	    return o;}
	else {
	    System.out.println("Attempt to dequeue from empty priority queue");
	    return null;
	}
    }
    
    public String toString() {
	if (size == 0) return "Empty Priority Queue \n";
	else 
	    return "Priority Queue elements from first to last are:\n" + list;
    }
    
    public int size() {
	return size; 
    }
    
    public boolean isEmpty() {
	return (size == 0);
    }
    
} // end of class PQAsList

public class TestPQAsListAlt {

    public static void main(String[] args) {
	
	PQAsList pq = new PQAsList();
	System.out.println(pq); //should print empty
	pq.put(new PQElement("Bill",3));
	System.out.println(pq); //should print ((Bill,3))
	pq.put(new PQElement("Monica",1));
	System.out.println(pq); //should print ((Bill,3),(Monica,1))
	pq.put(new PQElement("Hillary",4));
	System.out.println(pq); //should print ((Hillary,4),(Bill,3),(Monica,1))
	pq.put(new PQElement("Newt",3));
	System.out.println(pq);//should print ((Hillary,4),(Bill,3),(Newt,3)(Monica,1))
	System.out.println("Get->" + pq.get()); //(Hillary,4)
	System.out.println(pq); //((Bill,3),(Newt,3),(Monica,1))
	pq.put(new PQElement("Gennifer",2)); 
	System.out.println(pq);//((Bill,3),(Newt,3),(Gennifer,2),(Monica,1))
	System.out.println("Get->" + pq.get());// (Bill,3)
	System.out.println(pq); //((Newt,3),(Gennifer,2),(Monica,1))
	System.out.println("Get->" + pq.get());//(Newt,3)
	System.out.println(pq);//((Gennifer,2),(Monica,1))
	System.out.println("Get->" + pq.get());//(Gennier,2)
	System.out.println(pq);//((Monica,1))
	System.out.println("Get->" + pq.get());//(Monica,1)
	System.out.println(pq);//empty PQ
    }
}
