namespace C_.Datastructures.Queue { internal class Queue { internal QueueNode? Head { get; set; } internal QueueNode? Tail { get; set; } private int Count { get; set; } = 0; public static Queue Create() { //Create a new queue without a head / tail return new Queue(); } public static Queue Create(T value) { //Create a new Queue with a head + tail QueueNode newNode = QueueNode.Create(value, default); return new Queue { Head = newNode, Tail = newNode, Count = 1 }; } public void Push(T value) { //Add an Item to the end of the Queue Count++; if (Count > 1) { Tail!.Next = QueueNode.Create(value, default); Tail = Tail!.Next; return; } Head = QueueNode.Create(value, default); Tail = Head; return; } public T? Pop() { //Take the item off the front of the queue T? value = default; if (Count > 0) {//Assign the default value if there are any items left in the Queue Count--; value = Head!.Value; Head = Head.Next; if (Count == 0) { Head = default; Tail = Head; } } return value; } public T? Peek() { //View item at the front of the Queue if (Count > 0) { return Head!.Value; } return default; } } }