
public class Queue<T>
{
	private Node first;
	private Node last;
	private int n;

	private class Node
	{
		private T value;
		private Node next;
	}

	public Queue()
	{
		first = null;
		last = null;
		n = 0;
	}

	public boolean empty()
	{
		return first == null;
	}

	public int size()
	{
		return n;
	}

	public T peek()
	{
		return first.value;
	}

	public void enqueue(T value)
	{
		Node oldlast = last;

		last = new Node();
		last.value = value;
		last.next = null;

		if (empty())
			first = last;
		else
			oldlast.next = last;

		n++;
	}

	public T dequeue()
	{
		T value = first.value;
		first = first.next;
		n--;

		if (empty())
			last = null;

		return value;
	}
}

