Bir röportaj için bana verilen en ilginç kodlama zorluklarından biri, işlevsel bir kuyruk oluşturmaktı. Gereksinim, her enqueue çağrısının eski kuyruğu ve kuyruktaki yeni öğeyi içeren yeni bir kuyruk oluşturmasıydı. Dequeue ayrıca yeni bir kuyruk ve dequeued öğeyi bir çıkış parametresi olarak döndürür.
Bu uygulamadan bir IEnumerator oluşturmak tahribatsız olacaktır. Ve size iyi performans gösteren bir Fonksiyonel Kuyruk uygulamanızı söyleyeyim, performans gösteren bir İşlevsel Yığın uygulamaktan çok daha zor (yığın Push / Pop her iki Kuyruk üzerinde çalışır, kuyrukta bir Kuyruk Enqueue kuyrukta çalışır, kafasında çalışır).
Demek istediğim ... Kendi İşaretçi mekanizmanızı (StackNode <T>) uygulayarak ve Enumerator'da işlevsel anlambilimi kullanarak tahribatsız bir Stack Enumerator oluşturmak önemsizdir.
public class Stack<T> implements IEnumerator<T>
{
private class StackNode<T>
{
private readonly T _data;
private readonly StackNode<T> _next;
public StackNode(T data, StackNode<T> next)
{
_data=data;
_next=next;
}
public <T> Data{get {return _data;}}
public StackNode<T> Next{get {return _Next;}}
}
private StackNode<T> _head;
public void Push(T item)
{
_head =new StackNode<T>(item,_head);
}
public T Pop()
{
//Add in handling for a null head (i.e. fresh stack)
var temp=_head.Data;
_head=_head.Next;
return temp;
}
///Here's the fun part
public IEnumerator<T> GetEnumerator()
{
//make a copy.
var current=_head;
while(current!=null)
{
yield return current.Data;
current=_head.Next;
}
}
}
Dikkat edilmesi gereken bazı şeyler. Current = _head ifadesinden önce itme veya açma çağrısı; tamamlamalar numaralandırma için size çoklu iş parçacığı olmadığından farklı bir yığın verir (buna karşı korumak için bir ReaderWriterLock kullanmak isteyebilirsiniz). StackNode içindeki alanları salt okunur yaptım ama elbette T değişken bir nesne ise değerlerini değiştirebilirsiniz. Parametre olarak bir StackNode alan bir Stack yapıcısı oluşturuyorsanız (ve düğümü başa iletilen başlığa ayarlarsanız). Bu şekilde inşa edilen iki yığın birbirini etkilemeyecektir (bahsettiğim gibi değişebilir bir T hariç). İstediğiniz her şeyi bir yığın halinde Push ve Pop yapabilirsiniz, diğeri değişmez.
Ve arkadaşım, bir Yığın tahribatsız numaralandırmasını nasıl yaptığınızı.