// Alternative Q implemented using lists

class QueueAsListAlt implements SeqStructure{

    private ListNode first;
    private ListNode last; 
    
    public QAsList() { }
    
    // put o at end of list 
    public void put(Object o) {
	ListNode temp = new ListNode(o,null);
	if (isEmpty()){ 
	    // empty queue
	    first = temp;
	    last = temp;
	}
	else {
	    // nonempty queue, so chain to last cell in queue
	    last.setNext(temp);
	    last = temp;
	}
    }
    
    // define the usual stack synonym for put
    public void enqueue(Object o) {
	put(o);
    }
    
    public Object get() { // remove and return first element of list l
	if (! isEmpty()){
	    Object v = first.getHead().getItem();
	    first = first.getNext();
	    return v;
	}
	else {
	    System.out.println("Empty!");
	    return null;
	}
    }
    
    // define the usual stack synonym for get
    public Object dequeue() {
	return get();
    }
    
    public boolean isEmpty() { // any elements in first??
	return (first == null);
    }
    
    public int size() {
	int v = 0;
	ListNode finger = first;
	// this is called "walking down the list"
	while (finger != null) {
	    v = v + 1;
	    finger = finger.getNext();}
	return v;
    }
    
    
    public String toString() {
	if (isEmpty()) return "Empty Queue";
	return "Queue elements from first to last:" + first;
    }
}

class TestQueueAsListAlt {
    public static void main(String[] args) {
	QAsList s = new QAsList();
	s.enqueue("Hello");
	s.enqueue("Dolly");
	System.out.println(s);
	System.out.println(s.dequeue());
	System.out.println(s.dequeue());
    }
}
