class QueueADT
{   Link first, last;

    public QueueADT()
    {  first = null;
       last = null;	
    }
	
	public boolean isEmpty()
	{  return first == null;
	}	
	
	public void AddNode(Object obj)
	//pre: List initialized
	//post adds node to end of list
	{ Link temp = new Link();
	  temp.data = obj;
	  temp.next = null;
	  if (first == null)
	   first = temp;	 
	  else
	   last.next = temp;
	  last = temp;	      	    
	}
	
	public Object pop()
	{//pre: non-empty list exists
	 //removes from node from list
	  if(first == null)
	  	  throw new  NullPointerException("you popped an empty list");
	  Link temp = first;
	  first = first.next;//advance first by one
	  return temp.data;  
	}	    
	
	public int numNodes()
	{//counts number of nodes in the list
	  Link temp;
	  int count = 0;
	  temp = first;
	  while (temp != null)
	  { count++;
	    temp = temp.next;  
	  }
	  return count;
	}
	
	public void print()
	{ Link temp = first;
      while ( temp !=null)	
	  {  System.out.print( temp.data+ " ");
	     temp = temp.next;
	  }
	  System.out.println();
	}	
	
  private  class Link
//An embedded class used by a static method (main) must be static  
  {  public Object data;
     public Link next;
  }
} 

