public class ArrayQueue<T> {
private int _capacity = 10;
_storage = new T[_capacity];
public void Enqueue(T elem) {
if(_length == _capacity) {
throw new Exception("queue overflow");
_storage[++_end % _capacity] = elem;
Console.WriteLine(_start);
var elem = _storage[_start % _capacity];
_storage[_start % _capacity] = default(T);
public int Length { get { return _length; } }
public static void Main()
var q = new ArrayQueue<int>();
Console.WriteLine("len={0}", q.Length);
Console.WriteLine("len={0}", q.Length);
Console.WriteLine("len={0} elem={1}", q.Length, elem);
Console.WriteLine("len={0}", q.Length);
Console.WriteLine("len={0} elem={1}", q.Length, elem);
Console.WriteLine("len={0}", q.Length);
Console.WriteLine("len={0} elem={1}", q.Length, elem);
for(int i = 1; i <= 10; i++) {
Console.WriteLine("len={0}", q.Length);
var queueContent = new int[q.Length];
for(int i = 0; i < 10; i++) {
queueContent[i] = q.Dequeue();
Console.WriteLine("len={0} elems={1}", q.Length, string.Join(",", queueContent));