/**
 * A Queue (of Object objects)
 *
 * This implementation uses linked memory
 *
 * @author  Prof. David Bernstein, James Madison University
 * @version 1.0
 */
    public class Queue
   {
      private int         size;    
      private Node        back, front;
   
   
    /**
     * Construct a new (empty) Queue
     */
       public Queue()
      {
         front = null;
         size = 0;        
      }
   
   
   
    /**
     * Pop an Object off of the front of this Queue
     *
     * @return  The Object at the front of this Queue
     */
       public Object pop()
      {
         Object  value;
      
      
         if (front != null) 
         {
            value = front.value;
            front = front.next;
            size--;            
         } 
         else
         {
            value = null;
         }
      
         return value;
      }
   
   
    /**
     * Push an Object onto the back of this Queue
     *
     * @param last   The Object to push
     */
       public void push(Object last)
      {
         Node temp;
      
         temp = new Node();
         temp.value = last;
         temp.next = null;
      
         size++;        
      
         if (front == null) 
         {
            front = temp;
         }
         else
         {
            back.next = temp;
         }
      
         back = temp;
      }
   
   
    /**
     * Return the number of elements currently
     * in this Queue
     */
       public int size()
      {
         return size;       
      }
    
   
       private class Node
      {
         Object value;
         Node next;
      }
   }