using System; using System.Collections; using System.Collections.Generic; public class CircularQueue : IEnumerable { private T[] arr; private const int DefaultCapacity = 4; public int Count { get; private set; } public int Capasity { get; private set; } private int head; private int tail; public CircularQueue(int capacity = DefaultCapacity) { this.Capasity = capacity; this.Count = 0; this.arr = new T[this.Capasity]; this.head = 0; this.tail = 0; } public void Enqueue(T element) { if (this.Count >= this.Capasity) { this.Resize(); } this.arr[tail] = element; this.tail = (this.tail + 1) % this.Capasity; this.Count++; } private void Resize() { T[] newArray = new T[this.Capasity * 2]; this.CopyAllElements(newArray); this.Capasity *= 2; this.arr = newArray; } private void CopyAllElements(T[] newArray) { for (int i = 0; i < this.Count; i++) { int index = (i + this.head) % this.Capasity; newArray[i] = this.arr[index]; } this.head = 0; this.tail = this.Count; } public T Dequeue() { if (this.Count == 0) { throw new InvalidOperationException(); } T element = this.arr[this.head]; this.head = (this.head + 1) % this.Capasity; this.Count--; return element; } public T[] ToArray() { T[] newArr = new T[this.Count]; this.CopyAllElements(newArr); return newArr; } public IEnumerator GetEnumerator() { throw new Exception(); } IEnumerator IEnumerable.GetEnumerator() { return this.GetEnumerator(); } } public class Example { public static void Main() { CircularQueue queue = new CircularQueue(); queue.Enqueue(1); queue.Enqueue(2); queue.Enqueue(3); queue.Enqueue(4); queue.Enqueue(5); queue.Enqueue(6); Console.WriteLine("Count = {0}", queue.Count); Console.WriteLine(string.Join(", ", queue.ToArray())); Console.WriteLine("---------------------------"); int first = queue.Dequeue(); Console.WriteLine("First = {0}", first); Console.WriteLine("Count = {0}", queue.Count); Console.WriteLine(string.Join(", ", queue.ToArray())); Console.WriteLine("---------------------------"); queue.Enqueue(-7); queue.Enqueue(-8); queue.Enqueue(-9); Console.WriteLine("Count = {0}", queue.Count); Console.WriteLine(string.Join(", ", queue.ToArray())); Console.WriteLine("---------------------------"); first = queue.Dequeue(); Console.WriteLine("First = {0}", first); Console.WriteLine("Count = {0}", queue.Count); Console.WriteLine(string.Join(", ", queue.ToArray())); Console.WriteLine("---------------------------"); queue.Enqueue(-10); Console.WriteLine("Count = {0}", queue.Count); Console.WriteLine(string.Join(", ", queue.ToArray())); Console.WriteLine("---------------------------"); first = queue.Dequeue(); Console.WriteLine("First = {0}", first); Console.WriteLine("Count = {0}", queue.Count); Console.WriteLine(string.Join(", ", queue.ToArray())); Console.WriteLine("---------------------------"); } }