Στοίβα C# με Παραδείγματα Push & Pop
⚡ Έξυπνη Σύνοψη
Η στοίβα σε C# είναι μια συλλογή από τον χώρο ονομάτων System.Collections που ακολουθεί την αρχή LIFO (last in, first out), όπου η μέθοδος Push προσθέτει ένα στοιχείο στην κορυφή και η μέθοδος Pop το αφαιρεί.
Τι είναι το Stack σε C#;
Η στοίβα είναι μια συλλογή ειδικής θήκης που αντιπροσωπεύει μια ιδέα τελευταίας εισόδου (LIFO). Για να καταλάβετε πρώτα το LIFO, ας πάρουμε ένα παράδειγμα. Φανταστείτε μια στοίβα βιβλία με κάθε βιβλίο να είναι το ένα πάνω στο άλλο.
Η έννοια του last in first out στην περίπτωση των βιβλίων σημαίνει ότι μόνο το κορυφαίο βιβλίο μπορεί να αφαιρεθεί από τη στοίβα των βιβλίων. Δεν είναι δυνατό να αφαιρέσετε ένα βιβλίο από το ενδιάμεσο, γιατί τότε αυτό θα διαταράξει τη ρύθμιση της στοίβας.
Ως εκ τούτου σε C#, η στοίβα λειτουργεί επίσης με τον ίδιο τρόπο. Στοιχεία προστίθενται στη στοίβα, το ένα πάνω στο άλλο. Η διαδικασία προσθήκης ενός στοιχείου στη στοίβα ονομάζεται λειτουργία ώθησης. Για να αφαιρέσετε ένα στοιχείο από μια στοίβα, μπορείτε επίσης να αφαιρέσετε το επάνω μεγαλύτερο στοιχείο της στοίβας. Αυτή η λειτουργία είναι γνωστή ως pop.
Ας δούμε τις λειτουργίες που είναι διαθέσιμες για τη συλλογή Stack με περισσότερες λεπτομέρειες.
Δήλωση της στοίβας
Δημιουργείται μια στοίβα με τη βοήθεια του τύπου Stack Data. Η λέξη-κλειδί "νέο" χρησιμοποιείται για τη δημιουργία ενός αντικειμένου μιας Στοίβας. Στη συνέχεια, το αντικείμενο εκχωρείται στη μεταβλητή st.
Stack st = new Stack()
Προσθήκη στοιχείων στη στοίβα
Η μέθοδος ώθησης χρησιμοποιείται για την προσθήκη ενός στοιχείου στη στοίβα. Η γενική σύνταξη της δήλωσης δίνεται παρακάτω.
Stack.push(element)
Αφαίρεση στοιχείων από τη στοίβα
Η μέθοδος pop χρησιμοποιείται για την αφαίρεση ενός στοιχείου από τη στοίβα. Η λειτουργία pop θα επιστρέψει το ανώτατο στοιχείο της στοίβας. Η γενική σύνταξη της δήλωσης δίνεται παρακάτω
Stack.pop()
Κόμης
Αυτή η ιδιότητα χρησιμοποιείται για τη λήψη του αριθμού των στοιχείων στη Στοίβα. Παρακάτω είναι η γενική σύνταξη αυτής της δήλωσης.
Stack.Count
Περιέχει
Αυτή η μέθοδος χρησιμοποιείται για να δούμε εάν ένα στοιχείο υπάρχει στη Στοίβα. Παρακάτω είναι η γενική σύνταξη αυτής της δήλωσης. Η δήλωση θα επιστρέψει true εάν το στοιχείο υπάρχει, διαφορετικά θα επιστρέψει την τιμή false.
Stack.Contains(element)
Τώρα ας δούμε ότι αυτό λειτουργεί σε επίπεδο κώδικα. Όλος ο παρακάτω κώδικας θα γραφτεί στο δικό μας Εφαρμογή κονσόλας. Ο κώδικας θα γραφτεί στο αρχείο μας Program.cs.
Στο παρακάτω πρόγραμμα, θα γράψουμε τον κώδικα για να δούμε πώς μπορούμε να χρησιμοποιήσουμε τις προαναφερθείσες μεθόδους.
Παράδειγμα 1: Μέθοδος Stack.Push().
Σε αυτό το παράδειγμα, θα δούμε
- Πώς δημιουργείται μια στοίβα.
- Πώς να εμφανίσετε τα στοιχεία της στοίβας και να χρησιμοποιήσετε τις μεθόδους Count και Contain.
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 Εξήγηση:-
- Το πρώτο βήμα χρησιμοποιείται για τη δήλωση της Στοίβας. Εδώ δηλώνουμε το "st" ως μεταβλητή για να κρατάμε τα στοιχεία της στοίβας μας.
- Στη συνέχεια, προσθέτουμε 3 στοιχεία στη στοίβα μας. Κάθε στοιχείο προστίθεται μέσω της μεθόδου Push.
- Τώρα, δεδομένου ότι τα στοιχεία στοίβας δεν είναι προσβάσιμα μέσω της θέσης ευρετηρίου όπως το λίστα πίνακα, πρέπει να χρησιμοποιήσουμε διαφορετική προσέγγιση για να εμφανίσουμε τα στοιχεία της στοίβας. Το αντικείμενο (obj) είναι μια προσωρινή μεταβλητή, η οποία δηλώνεται για τη διατήρηση κάθε στοιχείου της στοίβας. Στη συνέχεια χρησιμοποιούμε την εντολή foreach για να περάσουμε από κάθε στοιχείο της στοίβας. Για κάθε στοιχείο στοίβας, η τιμή εκχωρείται στη μεταβλητή obj. Στη συνέχεια χρησιμοποιούμε την εντολή Console.Writeline για να εμφανίσουμε την τιμή στην κονσόλα.
- Χρησιμοποιούμε την ιδιότητα Count (st.count) για να λάβετε τον αριθμό των στοιχείων στη στοίβα. Αυτή η ιδιοκτησία θα επιστρέψει έναν αριθμό. Στη συνέχεια, εμφανίζουμε αυτήν την τιμή στην κονσόλα.
- Στη συνέχεια χρησιμοποιούμε τη μέθοδο Contains για να δούμε αν η τιμή του 3 υπάρχει στη στοίβα μας. Αυτό θα επιστρέψει είτε αληθή είτε ψευδή τιμή. Στη συνέχεια, εμφανίζουμε αυτήν την τιμή επιστροφής στην κονσόλα.
Εάν ο παραπάνω κωδικός εισαχθεί σωστά και το πρόγραμμα εκτελεστεί, θα εμφανιστεί η ακόλουθη έξοδος.
Παραγωγή:
Από την έξοδο, μπορούμε να δούμε ότι εμφανίζονται τα στοιχεία της στοίβας. Επίσης, η τιμή του True εμφανίζεται για να πει ότι η τιμή του 3 ορίζεται στη στοίβα.
Σημείωση: Έχετε παρατηρήσει ότι το τελευταίο στοιχείο που ωθήθηκε στη στοίβα εμφανίζεται πρώτο. Αυτό είναι το κορυφαίο στοιχείο της στοίβας. Ο αριθμός των στοιχείων στοίβας εμφανίζεται επίσης στην έξοδο.
Παράδειγμα 2: Μέθοδος Stack.Pop().
Τώρα ας δούμε τη λειτουργία "αφαίρεση". Θα δούμε τον κωδικό που απαιτείται για την αφαίρεση του ανώτατου στοιχείου από τη στοίβα.
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 Εξήγηση:-
- Εδώ εκδίδουμε απλώς τη μέθοδο pop που χρησιμοποιείται για την αφαίρεση ενός στοιχείου από τη στοίβα.
Εάν ο παραπάνω κωδικός εισαχθεί σωστά και το πρόγραμμα εκτελεστεί, θα εμφανιστεί η ακόλουθη έξοδος.
Παραγωγή:
Μπορούμε να δούμε ότι το στοιχείο 3 αφαιρέθηκε από τη στοίβα.
Μέθοδος C# Stack Peek()
Οι μέθοδοι Push και Pop λειτουργούν με την κορυφή της στοίβας, αλλά μερικές φορές χρειάζεται να κοιτάξετε μόνο το πάνω στοιχείο χωρίς να το αφαιρέσετε. Η μέθοδος Peek κάνει ακριβώς αυτό. Επιστρέφει την υψηλότερη τιμή της στοίβας, ενώ αφήνει τη συλλογή αμετάβλητη, κάτι που είναι χρήσιμο όταν θέλετε να δοκιμάσετε το επόμενο στοιχείο πριν αποφασίσετε να το ανοίξετε.
Βήμα 1) Δημιουργήστε μια στοίβα και τοποθετήστε τρία στοιχεία πάνω της, έτσι ώστε η τιμή 3 να βρίσκεται στην κορυφή.
Βήμα 2) Καλέστε τη μέθοδο Peek για να διαβάσετε το πάνω στοιχείο και, στη συνέχεια, ελέγξτε την ιδιότητα Count για να επιβεβαιώσετε ότι δεν έχει αφαιρεθεί τίποτα.
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 Εξήγηση:-
- Δηλώνεται μια στοίβα με όνομα st και οι τιμές 1, 2 και 3 προστίθενται με τη μέθοδο Push, έτσι ώστε το 3 να γίνεται το κορυφαίο στοιχείο.
- Η μέθοδος Peek επιστρέφει το κορυφαίο στοιχείο χωρίς να το αφαιρέσει και η ιδιότητα Count εξακολουθεί να αναφέρει τον πλήρη αριθμό των στοιχείων στη στοίβα.
Όταν εκτελείται το πρόγραμμα, εκτυπώνει την τιμή 3 από το Peek και μετά την καταμέτρηση 3, το οποίο αποδεικνύει ότι το στοιχείο παραμένει στη στοίβα. Εάν η στοίβα είναι άδεια, ο Peek ρίχνει ένα InvalidOperationException, επομένως είναι ασφαλές να ελέγξετε το Count πριν το καλέσετε.
Γενική στοίβα σε C#
Τα παραπάνω παραδείγματα χρησιμοποιούν την μη γενική κλάση Stack από το System.Collections, η οποία αποθηκεύει κάθε στοιχείο ως αντικείμενο. Ο σύγχρονος κώδικας C# συνήθως προτιμά την γενική κλάση Stack. κλάση από τον χώρο ονομάτων System.Collections.Generic. Συνδέει τη στοίβα με έναν μόνο δηλωμένο τύπο, επομένως ο μεταγλωττιστής ελέγχει κάθε Push και Pop και δεν χρειάζεται μετατροπή ή τοποθέτηση σε κουτί.
Τα βασικά οφέλη του γενικού Stack παρατίθενται παρακάτω.
- Ασφάλεια τύπου: Ο τύπος είναι σταθερός κατά τη δήλωση, επομένως μόνο τιμές αυτού του τύπου μπορούν να προωθηθούν και τα σφάλματα εντοπίζονται κατά τη στιγμή της μεταγλώττισης.
- Χωρίς πυγμαχία: Οι τύποι τιμών όπως ο int αποθηκεύονται απευθείας, γεγονός που αποφεύγει το κόστος boxing που πληρώνει η μη γενική στοίβα.
- Ο καθαριστής διαβάζει: Οι συναρτήσεις 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).
- Μέθοδοι: Μια στοίβα χρησιμοποιεί την ώθηση και την ανατροπή, ενώ μια ουρά χρησιμοποιεί την εισαγωγή στην ουρά για προσθήκη και την αφαίρεση από την ουρά για αφαίρεση.
- Πρόσβαση από το επάνω στοιχείο: Μια στοίβα διαβάζει το επόμενο στοιχείο της με το Peek και μια ουρά διαβάζει το επόμενο στοιχείο της με το Peek από την αρχή.
- Τυπικές χρήσεις: Στοίβες, χαρακτηριστικά αναίρεσης, αξιολόγηση έκφρασης και αναδρομή tracβασιλιάς, ενώ οι ουρές ταιριάζουν στον προγραμματισμό, την προσωρινή αποθήκευση και την διέλευση κατά πλάτος.
Και οι δύο τύποι είναι διαθέσιμοι σε γενική μορφή ως Stack και Ουρά στο System.Collections.Generic, ώστε να αποκτάτε ασφάλεια τύπων με οποιαδήποτε από τις δύο επιλογές.





