एक साक्षात्कार के लिए मुझे सबसे दिलचस्प कोडिंग चुनौतियों में से एक कार्यात्मक कतार बनाना था। आवश्यकता यह थी कि प्रत्येक कॉल करने के लिए एक नई कतार बनाई जाएगी जिसमें पुरानी कतार और पूंछ में नई वस्तु शामिल थी। Dequeue भी एक नई कतार और एक आउट परम के रूप में dequeued आइटम लौटाएगा।
इस कार्यान्वयन से एक IEnumerator बनाना nondestructive होगा। और मैं आपको एक कार्यात्मक कतार को लागू करने के बारे में बताता हूं जो एक अच्छा प्रदर्शन करता है, एक प्रदर्शनकारी कार्यात्मक स्टैक को लागू करने की तुलना में बहुत अधिक कठिन है (पूंछ पर स्टैक पुश / पॉप दोनों काम करते हैं, पूंछ पर एक क्यू एन्क्यू काम करता है, सिर पर काम करता है)।
मेरा कहना है ... यह अपने स्वयं के पॉइंटर तंत्र (स्टैकनोड <टी>) को लागू करके और एन्यूमरेटर में कार्यात्मक शब्दार्थ का उपयोग करके एक नॉनस्टेस्ट्रक्टिव स्टैक एन्यूमर बनाने के लिए तुच्छ है।
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;
}
}
}
ध्यान देने योग्य कुछ बातें। स्टेटमेंट = _हेड से पहले पुश या पॉप करने के लिए कॉल; पूर्णता आपको एन्यूमरेशन के लिए एक अलग स्टैक देगी यदि कोई मल्टीथ्रेडिंग नहीं था (आप इस से बचाव के लिए ReaderWriterLock का उपयोग करना चाह सकते हैं)। मैंने स्टैकनोड में फ़ील्ड्स को आसानी से बनाया लेकिन निश्चित रूप से अगर टी एक उत्परिवर्तनीय वस्तु है, तो आप इसके मान बदल सकते हैं। यदि आप एक Stack कंस्ट्रक्टर बनाने वाले थे जो StackNode को एक पैरामीटर के रूप में लेता था (और नोड में पारित किए गए सिर पर सेट करता है)। इस तरह से निर्मित दो ढेर एक-दूसरे को प्रभावित नहीं करेंगे (जैसा कि मैंने उल्लेख किया था कि एक उत्परिवर्ती टी के अपवाद के साथ)। आप एक स्टैक में सभी को पुश और पॉप कर सकते हैं, दूसरा नहीं बदलेगा।
और यह है कि मेरा दोस्त है कि आप एक स्टैक की गैर-विनाशकारी गणना कैसे करते हैं।