The following program implements a queue using a circular linked list:

using System;

namespace ConsoleTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Queue q = new Queue();

            string input = "A B C D - E - - F - - - G";

            foreach (string item in input.Split(" ".ToCharArray()))
            {
                if (item.Equals("-") && !q.IsEmpty)
                    Console.Write(q.Dequeue() + " ");
                else
                    q.Enqueue(item);
            }

            Console.WriteLine("\n{0} item(s) left in the queue.", q.Size);
            Console.ReadKey();
        }

        class Queue where T : class
        {
            private Node last; 
            private int N; // queue size (the number of items in the linked list)

            public bool IsEmpty { get { return N == 0; } }
            public int Size { get { return N; } }

            public void Enqueue(T item)
            {
                // Add item to the end of the list.
                Node oldLast = last;
                last = new Node();
                last.Item = item;

                if (IsEmpty)
                    last.Next = last; // the last element is also the first one
                else
                {
                    // Wrap up the queue to make it circular.
                    last.Next = oldLast.Next; // keep the first element as last.Next
                    oldLast.Next = last; 
                }

                ++N;
            }

            public T Dequeue()
            {
                if (IsEmpty)
                    return default(T);

                // Keep the first item to return (last.Next is the first item).
                T item = last.Next.Item; 

                --N;

                // Remove the item from the beginning of the list.
                if (IsEmpty)
                    last = null;
                else
                    last.Next = last.Next.Next;

                return item;
            }

            // Nested class to define nodes of linked list.
            private class Node
            {
                public T Item { get; set; }
                public Node Next { get; set; }

                public override string ToString() { return (Item == null ? "null" : Item.ToString()); }
            }
        }
    }
}

Output:

A B C D E F
1 item(s) left in the queue.