Here is an alternative generic Queue class. I created it as I constantly found when using a queue class that Enqueue and Dequeue were never enough. There was always a need for a remove an item and a need to iterate through all the items in a queue.
The original basic source for the queue class is here.
public class Node< T >
{
public T Data { get; set; }
public Node<T> Next { get; set; }
public Node( T data )
{
this.Data = data;
}
}
public class Queue2< T >
{
private Node<T> _head;
private Node<T> _tail;
private int _count;
private readonly IEqualityComparer<T> _comparator;
public Queue2()
{
_comparator = EqualityComparer<T>.Default;
}
public Queue2( IEqualityComparer<T> comparator )
{
_comparator = comparator;
}
public void Enqueue(
T data )
{
Node<T> _newNode = new Node<T>( data );
if ( _head == null )
{
_head = _newNode;
_tail = _head;
}
else
{
_tail.Next = _newNode;
_tail = _tail.Next;
}
++_count;
}
public T Dequeue()
{
if ( _head == null )
{
throw new Exception( "Queue is Empty" );
}
T _result = _head.Data;
_head = _head.Next;
--_count;
return _result;
}
public void Remove(
T item )
{
Node<T> previous = null, cursor = _head;
bool found = false;
while ( ( cursor != null ) && !found )
{
found = _comparator.Equals( cursor.Data, item );
if ( found )
{
if ( previous == null )
{
_head = cursor.Next;
}
else
{
previous.Next = cursor.Next;
}
--count;
}
else
{
previous = cursor;
cursor = cursor.Next;
}
}
}
public void Clear()
{
_head = _tail = null;
count = 0;
}
public IEnumerable<T> GetEnumerator()
{
Node<T> cursor = _head;
while ( cursor != null )
{
yield return cursor.Data;
cursor = cursor.Next;
}
}
public int Count
{
get { return this._count; }
}
}
No comments:
Post a Comment