/**
* A Quack of objects
*
* This implementation uses linked memory
*
* @version 1.0
* @author Prof. David Bernstein, James Madison University
*/
public class Quack
{
	private Node first, last;

/**
 * Construct a new (empty) Quack
 */
 public Quack()
 {
	first = null;
	last = null;
 }  // end constructor
 
/**
 * Pep an Object off of this Quack
 *
 * @return The Object
 */
 public Object pep()
 {
		Node temp;
		Object value;
		value = null;
	
		if (first != null)
		{
			value = first.value;
			if (first == last)
			{
				first = null;
			}
			else
			{
				temp = last;
				while (temp.next != first)
				{
					temp = temp.next;
				}
				first = temp;
				first.next = null;
			}
		}
		if (first == null) 
			last = null;

		return value;
	}// end pep

 /**
  * Pip an Object off of this Quack
  *
  * @return The Object
  */
  public Object pip()
  {
		Object value;
		
		if (last != null)
		{
			value = last.value;
			last = last.next;
		}
		else
		{
			value = null;
		}
		
		if (last == null) 
			first = null;

		return value;
	}// end pip

 /**
  * Push an Object onto this Quack 
  *
  * @param anObject The Object to push
  */
  public void push(Object anObject)
  {
		Node temp;
		temp = new Node();
		temp.value = anObject;
		temp.next = last;
		last = temp;
		if (first == null) 
			first = last;
	}// end push
}// end Quack	
