2013-12-09 6 views
7

सी # में, स्टैक तत्वों के माध्यम से बिना किसी स्टैक पर एक स्टैक को धक्का देने का कोई तरीका है? यदि नहीं, तो क्या एक बेहतर डेटा संरचना का उपयोग करना चाहिए? जावा में आप कर सकते हैं:किसी अन्य स्टैक पर एक स्टैक पुश करें

stack1.addAll(stack2) 

मैं सी # एनालॉग खोजने के लिए उम्मीद कर रहा था ...

+0

शायद थोड़ा सा उलझन, लेकिन 'ArrayList' को कास्ट करना http://msdn.microsoft.com/en-us/library/system.collections.arraylist.insertrange(v=vs.110).aspx और फिर स्टैक पर वापस कास्टिंग? – rdodev

+0

डुप्लिकेट? http://stackoverflow.com/questions/1594264/pushing-items-into-stack-with-linq –

+0

प्रत्येक स्टैक को ऐरे में कॉपी कर सकता है फिर सरणी का उपयोग करें। सरणी को मर्ज करने के लिए कॉपी करें और फिर एआर को सीटीआर में एक नए स्टैक पर लोड करें लेकिन मुझे लगता है कि मैं सिर्फ लूप होगा। – Paparazzi

उत्तर

3

0. सुरक्षित समाधान - एक्सटेंशन विधि

public static class Util { 
     public static void AddAll<T>(this Stack<T> stack1, Stack<T> stack2) { 
      T[] arr = new T[stack2.Count]; 
      stack2.CopyTo(arr, 0); 

      for (int i = arr.Length - 1; i >= 0; i--) { 
       stack1.Push(arr[i]); 
      } 
     } 
    } 

शायद सबसे अच्छा एक विस्तार विधि बनाने के लिए है। ध्यान दें कि मैं अन्य ढेर के "शीर्ष पर" पहले ढेर डाल रहा हूँ ताकि से पाशन द्वारा बात करने के लिए 0. arr.Length -1 को तो यह कोड:

Stack<int> x = new Stack<int>(); 
    x.Push(1); 
    x.Push(2); 

    Stack<int> y = new Stack<int>(); 
    y.Push(3); 
    y.Push(4);   

    x.AddAll(y); 

एक्स से किया जा रहा में परिणाम होगा: 4,3 , 2,1। यदि आप 1,2,3,4 दबाते हैं तो आप क्या उम्मीद करेंगे। बेशक, यदि आप अपने दूसरे ढेर और वास्तव में पॉप तत्वों के माध्यम से लूप करना चाहते थे और फिर उन्हें पहले स्टैक पर धक्का देना था, तो आप 1,2,4,3 के साथ समाप्त हो जाएंगे। फिर, जब आप फिट देखते हैं तो लूप के लिए संशोधित करें। या आप यह निर्दिष्ट करने के लिए एक और पैरामीटर जोड़ सकते हैं कि आप कौन सा व्यवहार चाहते हैं। मेरे पास जावा आसान नहीं है, इसलिए मुझे नहीं पता कि वे क्या करते हैं।

यह कहकर, आप कर सकते हैं, लेकिन मुझे कोई गारंटी नहीं है कि यह काम जारी रहेगा। टोलिस्ट को कॉल करते समय एमएस हमेशा डिफ़ॉल्ट व्यवहार को कैसे बदल सकता है। लेकिन, इस कम है, और पर .NET 4.5 के साथ मेरी मशीन ऊपर विस्तार पद्धति के रूप में एक ही काम करता है:

1 लाइन Linq समाधान:

y.Reverse().ToList().ForEach(item => x.Push(item)); 
+0

यह विचित्र है कि [एमएसडीएन दस्तावेज] (http://msdn.microsoft.com/en-us/library/yfw8w9at.aspx) स्पष्ट रूप से निर्दिष्ट नहीं करता है कि एक स्टैक किस क्रम में उल्लिखित है, हालांकि यह * है * उदाहरण। हालांकि, 'ToArray' विधि LIFO ऑर्डर निर्दिष्ट करती है। – Rawling

+0

मुझे आपका सुरक्षित समाधान पसंद है। यह वही व्यवहार है जो मैं चाहता हूं, अभी भी एक स्टैक के साथ काम कर रहा है (जब आप चीजों की तरह ढेर कर रहे हैं तो वे अवधारणात्मक रूप से अच्छे हैं)। – ryan0

1

एक addAll सिर्फ एक foreach पाश है कि आइटम के सभी कहते हैं के लिए एक सुविधा तरीका होगा। वहाँ वास्तव में नहीं है जितना आप उस के अलावा कर सकते हैं:

foreach(var item in stack2) 
    stack1.Push(item); 

आप यह विशेष रूप से अक्सर करते हैं आप अपने खुद के सुविधा के लिए इसके लिए एक विस्तार विधि जोड़ सकते हैं।

+0

हां, अब मैं देखता हूं कि उन AddRange/AddAll विधियां सभी पुनरावृत्ति करते हैं। मुझे लगता है कि मैं सुविधा के बाद था और वास्तव में प्रदर्शन नहीं था। – ryan0

1

अपने प्रश्न में, करना चाहते यह "स्टैक तत्वों के माध्यम से पुनरावृत्त किए बिना" मूल रूप से LinkedList-आधारित स्टैक का अर्थ है जहां आप निरंतर समय में ढेर को गठबंधन करने के लिए पहले और अंतिम तत्वों में शामिल होंगे।

हालांकि, जब तक कि आपके पास LinkedList का उपयोग करने के लिए एक बहुत ही विशिष्ट कारण नहीं है, तो संभवतः एक सरणी-आधारित (List-आधारित) स्टैक तत्वों को फिर से शुरू करने का बेहतर विचार है।

जहां तक ​​एक विशिष्ट कार्यान्वयन होता है, आपको शायद यह स्पष्ट करना चाहिए कि क्या आप दूसरे स्टैक को उसी स्टैक ऑर्डर में पहले में जोड़ना चाहते हैं या पॉप आउट होने से पहले स्टैक में वापस लेना चाहते हैं।

0

यह वर्तमान .NET स्टैक कार्यान्वयन के साथ नहीं किया जाना है।

स्टैक की सामग्री को बिना किसी स्टैक के अंत में "ग्राफ्ट" करने के लिए, इसके तत्वों के आंतरिक कार्यान्वयन के विवरण के बारे में बताते हैं कि स्टैक क्लास उन्हें स्मृति में कैसे संग्रहीत करता है। Encapsulation के सिद्धांत के आधार पर यह जानकारी "आधिकारिक तौर पर" केवल स्टैक वर्ग के अंदर ही पता है। ।एनईटी का ढेर ऐसा करने के तरीकों का पर्दाफाश नहीं करता है, इसलिए प्रतिबिंब का उपयोग किए बिना ओपी के अनुरोध के रूप में ऐसा करने का कोई तरीका नहीं है।

निश्चित रूप से आप किसी अन्य स्टैक की सामग्री को एक स्टैक की आंतरिक सरणी में जोड़ने के लिए प्रतिबिंब का उपयोग कर सकते हैं और स्टैक लम्बाई को संग्रहीत करने वाले फ़ील्ड को भी अपडेट कर सकते हैं लेकिन यह स्टैक क्लास के कार्यान्वयन पर अत्यधिक निर्भर होगा जिसे बदला जा सकता है चेतावनी के बिना ढांचे के भविष्य के संस्करणों में।

तुम सच में एक ढेर है कि इस आप स्क्रैच से अपने खुद के ढेर वर्ग लिख सकता है क्या कर सकते हैं या बस ArrayList या LinkedList जो विधि आप चाहते हैं और उन्हें Push और Pop विस्तार विधियों को जोड़ने है की तरह एक और संग्रह का उपयोग की जरूरत है।

संबंधित मुद्दे