पुश और पॉप उदाहरणों के साथ C# स्टैक

⚡ स्मार्ट सारांश

C# में स्टैक, System.Collections नेमस्पेस से एक कलेक्शन है जो लास्ट इन, फर्स्ट आउट (LIFO) सिद्धांत का पालन करता है, जहां पुश विधि सबसे ऊपर एक तत्व जोड़ती है और पॉप विधि उसे हटा देती है।

  • 📚 LIFO अवधारणा: स्टैक किताबों के ढेर की तरह काम करता है, इसलिए सबसे आखिरी में जोड़ा गया तत्व सबसे पहले हटाया जाता है।
  • पुश और पॉप: Push विधि स्टैक के शीर्ष पर एक तत्व जोड़ती है, और Pop विधि उस सबसे ऊपरी तत्व को हटाकर वापस लौटाती है।
  • ???? झाँकें, गिनें, इसमें शामिल हैं: पीक विधि शीर्ष तत्व को हटाए बिना उसे पढ़ती है, जबकि काउंट और कंटेन्स आकार और सदस्यता की रिपोर्ट करते हैं।
  • 🧪 उदाहरण सहित हल: दो कंसोल प्रोग्राम काउंट और कंटेन्स के साथ पुश और फिर पॉप का प्रदर्शन करते हैं, ताकि आप tracLIFO क्रम का पालन करें।
  • जेनेरिक स्टैक: ढेर System.Collections.Generic में मौजूद क्लास कंपाइल-टाइम टाइप सेफ्टी जोड़ती है और नए C# कोड के लिए बॉक्सिंग से बचाती है।
  • 🤖 एआई सहायता: GitHub Copilot C# स्टैक ऑपरेशंस के लिए ढांचा तैयार करता है, और ML.NET गैर-जेनेरिक स्टैक के बजाय टाइप किए गए संग्रहों के माध्यम से डेटा पढ़ता है।

सी# स्टैक

C# में स्टैक क्या है?

स्टैक एक विशेष केस कलेक्शन है जो लास्ट इन फर्स्ट आउट (LIFO) अवधारणा का प्रतिनिधित्व करता है। LIFO को समझने के लिए सबसे पहले एक उदाहरण लेते हैं। किताबों के एक ढेर की कल्पना करें जिसमें हर किताब एक दूसरे के ऊपर रखी हुई है।

किताबों के मामले में अंतिम में पहले बाहर की अवधारणा का मतलब है कि किताबों के ढेर से केवल सबसे ऊपर वाली किताब ही निकाली जा सकती है। बीच से किताब निकालना संभव नहीं है, क्योंकि ऐसा करने से ढेर की सेटिंग गड़बड़ा जाएगी।

इसलिए में C#स्टैक भी इसी तरह काम करता है। स्टैक में एक के ऊपर एक एलिमेंट जोड़े जाते हैं। स्टैक में एलिमेंट जोड़ने की प्रक्रिया को पुश ऑपरेशन कहते हैं। स्टैक से एलिमेंट हटाने के लिए आप स्टैक के सबसे ऊपर वाले एलिमेंट को भी हटा सकते हैं। इस ऑपरेशन को पॉप कहते हैं।

आइए स्टैक संग्रह के लिए उपलब्ध परिचालनों पर अधिक विस्तार से नजर डालें।

स्टैक की घोषणा

स्टैक डेटा प्रकार की सहायता से स्टैक बनाया जाता है। स्टैक का ऑब्जेक्ट बनाने के लिए “new” कीवर्ड का उपयोग किया जाता है। फिर ऑब्जेक्ट को st वेरिएबल को असाइन किया जाता है।

Stack st = new Stack()

स्टैक में तत्व जोड़ना

पुश विधि का उपयोग स्टैक पर एक तत्व जोड़ने के लिए किया जाता है। कथन का सामान्य सिंटैक्स नीचे दिया गया है।

Stack.push(element)

स्टैक से तत्वों को हटाना

पॉप विधि का उपयोग स्टैक से किसी तत्व को हटाने के लिए किया जाता है। पॉप ऑपरेशन स्टैक के सबसे ऊपरी तत्व को लौटाएगा। कथन का सामान्य सिंटैक्स नीचे दिया गया है

 Stack.pop()

गिनती

इस प्रॉपर्टी का उपयोग स्टैक में आइटम की संख्या जानने के लिए किया जाता है। नीचे इस कथन का सामान्य सिंटैक्स दिया गया है।

Stack.Count

शामिल हैं

इस विधि का उपयोग यह देखने के लिए किया जाता है कि स्टैक में कोई तत्व मौजूद है या नहीं। नीचे इस कथन का सामान्य सिंटैक्स दिया गया है। यदि तत्व मौजूद है तो कथन सत्य लौटाएगा, अन्यथा यह गलत मान लौटाएगा।

Stack.Contains(element)

अब आइए इसे कोड स्तर पर काम करते हुए देखें। नीचे दिए गए सभी कोड हमारे लिए लिखे जाएँगे सांत्वना आवेदन. कोड हमारी Program.cs फ़ाइल में लिखा जाएगा.

नीचे दिए गए प्रोग्राम में, हम कोड लिखकर देखेंगे कि हम उपर्युक्त विधियों का उपयोग कैसे कर सकते हैं।

उदाहरण 1: Stack.Push() विधि

इस उदाहरण में हम देखेंगे

  • स्टैक का निर्माण कैसे होता है?
  • स्टैक के तत्वों को कैसे प्रदर्शित करें, तथा Count और Contain विधियों का उपयोग कैसे करें।

C# में स्टैक

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   Stack st = new Stack();
   st.Push(1);
   st.Push(2);
   st.Push(3);

   foreach (Object obj in st)
   {
    Console.WriteLine(obj);
   }
    Console.WriteLine(); Console.WriteLine();
    Console.WriteLine("The number of elements in the stack " +st.Count);
    Console.WriteLine("Does the stack contain the elements 3 "+st.Contains(3));
    Console.ReadKey();
  }
 }
}

Code स्पष्टीकरण: -

  1. पहला चरण स्टैक घोषित करने के लिए उपयोग किया जाता है। यहाँ हम अपने स्टैक के तत्वों को रखने के लिए “st” को एक चर के रूप में घोषित कर रहे हैं।
  2. इसके बाद, हम अपने स्टैक में 3 तत्व जोड़ते हैं। प्रत्येक तत्व को पुश विधि के माध्यम से जोड़ा जाता है।
  3. अब चूंकि स्टैक तत्वों तक इंडेक्स स्थिति के माध्यम से नहीं पहुंचा जा सकता है जैसे सरणी सूची, हमें स्टैक के तत्वों को प्रदर्शित करने के लिए एक अलग दृष्टिकोण का उपयोग करने की आवश्यकता है। ऑब्जेक्ट (obj) एक अस्थायी चर है, जिसे स्टैक के प्रत्येक तत्व को रखने के लिए घोषित किया जाता है। फिर हम स्टैक के प्रत्येक तत्व से गुजरने के लिए foreach कथन का उपयोग करते हैं। प्रत्येक स्टैक तत्व के लिए, मान obj चर को सौंपा जाता है। फिर हम कंसोल पर मान प्रदर्शित करने के लिए Console.Writeline कमांड का उपयोग करते हैं।
  4. हम Count प्रॉपर्टी का उपयोग कर रहे हैं (सेंट गिनती) का उपयोग करके स्टैक में मौजूद आइटम की संख्या प्राप्त करें। यह प्रॉपर्टी एक संख्या लौटाएगी। फिर हम यह मान कंसोल पर प्रदर्शित करते हैं।
  5. फिर हम Contains विधि का उपयोग करके देखते हैं कि क्या 3 का मान हमारे स्टैक में मौजूद है। यह या तो true या false मान लौटाएगा। फिर हम इस रिटर्न मान को कंसोल पर प्रदर्शित करते हैं।

यदि उपरोक्त कोड ठीक से दर्ज किया गया है और प्रोग्राम चलाया गया है तो निम्नलिखित आउटपुट प्रदर्शित होगा।

आउटपुट:

C# में स्टैक

आउटपुट से हम देख सकते हैं कि स्टैक के तत्व प्रदर्शित किए गए हैं। साथ ही, True का मान प्रदर्शित किया गया है, जिसका अर्थ है कि स्टैक पर 3 का मान परिभाषित किया गया है।

नोट: आपने देखा होगा कि स्टैक पर धकेला गया अंतिम तत्व सबसे पहले प्रदर्शित होता है। यह स्टैक का सबसे ऊपरी तत्व है। आउटपुट में स्टैक तत्वों की गिनती भी दिखाई जाती है।

उदाहरण 2: Stack.Pop() विधि

अब आइए “remove” कार्यक्षमता पर नज़र डालें। हम स्टैक से सबसे ऊपर वाले तत्व को हटाने के लिए आवश्यक कोड देखेंगे।

C# में स्टैक

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   Stack st = new Stack();
   st.Push(1);
   st.Push(2);
   st.Push(3);
   
   st.Pop();

   foreach (Object obj in st)
   {
    Console.WriteLine(obj);
   }
    Console.ReadKey();
  }
 }
}

Code स्पष्टीकरण: -

  1. यहां हम केवल पॉप विधि जारी करते हैं जिसका उपयोग स्टैक से किसी तत्व को हटाने के लिए किया जाता है।

यदि उपरोक्त कोड ठीक से दर्ज किया गया है और प्रोग्राम चलाया गया है, तो निम्नलिखित आउटपुट प्रदर्शित होगा।

आउटपुट:

C# में स्टैक

हम देख सकते हैं कि तत्व 3 को स्टैक से हटा दिया गया है।

C# स्टैक पीक() विधि

Push और Pop विधियाँ स्टैक के शीर्ष पर काम करती हैं, लेकिन कभी-कभी आपको केवल शीर्ष तत्व को देखने की आवश्यकता होती है, उसे हटाए बिना। Peek विधि ठीक यही करती है। यह संग्रह को अपरिवर्तित रखते हुए स्टैक का सबसे ऊपरी मान लौटाती है, जो तब उपयोगी होता है जब आप किसी आइटम को हटाने का निर्णय लेने से पहले अगले आइटम का परीक्षण करना चाहते हैं।

चरण 1) एक स्टैक बनाएं और उसमें तीन तत्व डालें, ताकि 3 सबसे ऊपर रहे।

चरण 2) शीर्ष तत्व को पढ़ने के लिए पीक विधि को कॉल करें, फिर यह पुष्टि करने के लिए काउंट प्रॉपर्टी की जांच करें कि कुछ भी हटाया नहीं गया है।

using System;
using System.Collections;

namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   Stack st = new Stack();
   st.Push(1);
   st.Push(2);
   st.Push(3);
   Console.WriteLine(st.Peek());
   Console.WriteLine(st.Count);
   Console.ReadKey();
  }
 }
}

Code स्पष्टीकरण: -

  1. st नाम का एक स्टैक घोषित किया जाता है, और Push विधि का उपयोग करके 1, 2 और 3 मानों को जोड़ा जाता है, जिससे 3 सबसे ऊपरी तत्व बन जाता है।
  2. पीक विधि स्टैक से शीर्ष तत्व को हटाए बिना उसे लौटाती है, और काउंट प्रॉपर्टी अभी भी स्टैक में मौजूद वस्तुओं की पूरी संख्या बताती है।

जब प्रोग्राम चलता है, तो यह मान प्रिंट करता है। 3 पीक से और फिर गिनती 3जो यह साबित करता है कि एलिमेंट स्टैक पर बना रहता है। यदि स्टैक खाली है, तो पीक एक अमान्य त्रुटि उत्पन्न करता है।OperationException की संभावना कम होती है, इसलिए इसे कॉल करने से पहले Count की जांच करना सुरक्षित है।

जेनेरिक स्टैक C# में

ऊपर दिए गए उदाहरणों में System.Collections की नॉन-जेनेरिक Stack क्लास का उपयोग किया गया है, जो प्रत्येक एलिमेंट को एक ऑब्जेक्ट के रूप में स्टोर करती है। आधुनिक C# कोड आमतौर पर जेनेरिक Stack को प्राथमिकता देता है। System.Collections.Generic नेमस्पेस से क्लास। यह स्टैक को एक ही घोषित प्रकार से बांधता है, इसलिए कंपाइलर प्रत्येक पुश और पॉप की जांच करता है और किसी कास्टिंग या बॉक्सिंग की आवश्यकता नहीं होती है।

जेनरिक स्टैक के प्रमुख लाभ नीचे सूचीबद्ध हैं।

  • टाइप सुरक्षा: घोषणा के समय ही प्रकार तय हो जाता है, इसलिए केवल उसी प्रकार के मानों को ही पुश किया जा सकता है, और त्रुटियों को संकलन समय पर ही पकड़ लिया जाता है।
  • मुक्केबाजी निषेध: int जैसे वैल्यू टाइप सीधे स्टोर किए जाते हैं, जिससे नॉन-जेनेरिक स्टैक द्वारा वहन की जाने वाली बॉक्सिंग लागत से बचा जा सकता है।
  • क्लीनर रीड्स: Pop और Peek सीधे घोषित प्रकार लौटाते हैं, इसलिए आपको परिणाम को ऑब्जेक्ट से वापस कास्ट करने की आवश्यकता नहीं होती है।
using System;
using System.Collections.Generic;

namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   Stack<string> st = new Stack<string>();
   st.Push("Java");
   st.Push("Python");
   Console.WriteLine(st.Pop());
   Console.ReadKey();
  }
 }
}

इस उदाहरण में स्टैक को Stack के रूप में घोषित किया गया है। इसलिए यह केवल स्ट्रिंग मान स्वीकार करता है। Pop विधि सीधे एक स्ट्रिंग लौटाती है और प्रिंट करती है। Pythonअंतिम बार पुश किया गया मान। किसी भी नए प्रोजेक्ट के लिए, जेनेरिक स्टैक यह अनुशंसित विकल्प है।

C# में स्टैक और क्यू के बीच अंतर

एक ढेर और एक पंक्ति स्टैक और क्यू दोनों ही ऐसे कलेक्शन हैं जो तत्वों को हटाने के क्रम को नियंत्रित करते हैं, लेकिन इनके नियम एक-दूसरे के विपरीत हैं। स्टैक में 'लास्ट इन, फर्स्ट आउट' का सिद्धांत लागू होता है, जबकि क्यू में 'फर्स्ट इन, फर्स्ट आउट' का। सही कलेक्शन चुनने से आपके कोड का उद्देश्य अन्य डेवलपर्स को स्पष्ट हो जाता है।

मुख्य अंतर नीचे सूचीबद्ध हैं:

  • आदेश: स्टैक में सबसे हाल ही में जोड़ा गया तत्व पहले हटाया जाता है (LIFO), जबकि क्यू में सबसे पुराना तत्व पहले हटाया जाता है (FIFO)।
  • तरीके: स्टैक में पुश और पॉप का उपयोग होता है, जबकि क्यू में जोड़ने के लिए एनक्यू और हटाने के लिए डीक्यू का उपयोग होता है।
  • शीर्ष-तत्व पहुंच: एक स्टैक अपने अगले आइटम को पीक विधि से पढ़ता है, और एक क्यू अपने अगले आइटम को पीक विधि से सामने से पढ़ता है।
  • विशिष्ट उपयोग: स्टैक्स अनडू फीचर्स, एक्सप्रेशन इवैल्यूएशन और रिकर्सन के लिए उपयुक्त हैं। tracकिंग, जबकि कतारें शेड्यूलिंग, बफरिंग और ब्रॉडथ-फर्स्ट ट्रैवर्सल के लिए उपयुक्त हैं।

दोनों प्रकार स्टैक के रूप में सामान्य रूप में उपलब्ध हैं। और कतार System.Collections.Generic में, इसलिए आपको दोनों विकल्पों के साथ टाइप सुरक्षा प्राप्त होती है।

अक्सर पूछे जाने वाले प्रश्न

खाली स्टैक पर Pop या Peek कॉल करने पर Invalid त्रुटि उत्पन्न होती है।OperationException. पहले Count प्रॉपर्टी की जाँच करें, या फिर जेनेरिक स्टैक मेथड TryPop और TryPeek का उपयोग करें, जो स्टैक में कोई एलिमेंट न होने पर त्रुटि उत्पन्न करने के बजाय false लौटाते हैं।

पुश और पॉप दोनों ऑपरेशन स्थिर O(1) समय में चलते हैं क्योंकि वे केवल स्टैक के शीर्ष को ही स्पर्श करते हैं। जब आंतरिक ऐरे का आकार बढ़ाना आवश्यक होता है, तो कभी-कभार पुश ऑपरेशन से उसका आकार बदल जाता है, लेकिन प्रति ऑपरेशन औसत लागत स्थिर रहती है।

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

क्लियर मेथड एक ही बार में स्टैक से सभी एलिमेंट हटा देता है और काउंट को शून्य पर रीसेट कर देता है। इसके बजाय, स्टैक के ऊपर से एक-एक करके आइटम हटाने के लिए, काउंट के शून्य होने तक लूप में पॉप मेथड को कॉल करें।

जब कई थ्रेड एक साथ Stack क्लास में बदलाव करते हैं, तो यह थ्रेड-सेफ नहीं है। एक साथ कई थ्रेड्स द्वारा एक्सेस करने के लिए, System.Collections.Concurrent से ConcurrentStack का उपयोग करें, जो बाहरी लॉक के बिना एटॉमिक TryPush और TryPop मेथड प्रदान करता है।

स्टैक को ऊपर से नीचे तक क्रमबद्ध करके एक नए ऐरे में कॉपी करने के लिए ToArray विधि को कॉल करें। आप स्टैक को List कंस्ट्रक्टर में भी पास कर सकते हैं ताकि एक जेनेरिक लिस्ट बनाई जा सके।ping एक ही आदेश।

जी हां। GitHub Copilot एक छोटे से कमेंट या मेथड नाम से स्टैक डिक्लेरेशन, पुश और पॉप कॉल, और फोरईच लूप लिखता है। यह अक्सर जेनेरिक स्टैक वर्जन का सुझाव देता है, क्योंकि नए C# कोड के लिए यही अनुशंसित कलेक्शन है।

स्टैक में ML.NET प्रशिक्षण डेटा शायद ही कभी संग्रहीत होता है, जो टाइप किए गए संग्रह और IDataView पाइपलाइन के माध्यम से प्रवाहित होता है। हालाँकि, बैकएंड के लिए मशीन लर्निंग एल्गोरिदम के भीतर LIFO स्टैक अवधारणा दिखाई देती है।tracकिंग, डेप्थ-फर्स्ट सर्च और रिकर्सिव मेथड कॉल्स का प्रबंधन।

इस पोस्ट को संक्षेप में इस प्रकार लिखें: