Θεωρία, Ερωτήσεις Ανάπτυξης, Quiz & Ασκήσεις
Στοίβα (stack) ονομάζεται μια δομή δεδομένων το σύνολο των στοιχείων της οποίας είναι διατεταγμένο με τέτοιο τρόπο, ώστε τα στοιχεία που βρίσκονται στην κορυφή λαμβάνονται πρώτα, ενώ αυτά που βρίσκονται στο βάθος λαμβάνονται τελευταία.
Παράδειγμα: Μια στοίβα από πιάτα — παίρνουμε το πιάτο που τοποθετήθηκε τελευταίο.
Προσθήκη στοιχείου στην κορυφή της στοίβας.
Αφαίρεση στοιχείου από την κορυφή της στοίβας.
top δείχνει στην προηγούμενη θέση.top = 0top ← top + 1A[top] ← στοιχείοA[top]top ← top - 1Δοκίμασε ώθηση και απώθηση στοιχείων. Η στοίβα γεμίζει από κάτω προς τα πάνω:
ΓΡΑΨΕ 'Δώσε στοιχείο για να εισαχθεί στην στοίβα Α:'
ΔΙΑΒΑΣΕ στοιχείο
ΑΝ top < 10 ΤΟΤΕ
top ← top + 1
A[top] ← στοιχείο
ΑΛΛΙΩΣ
ΓΡΑΨΕ 'Υπερχείλιση στοίβας'
ΤΕΛΟΣ_ΑΝ
ΑΝ top >= 1 ΤΟΤΕ
ΓΡΑΨΕ Α[top]
top ← top - 1
ΑΛΛΙΩΣ
ΓΡΑΨΕ 'Υποχείλιση στοίβας'
ΤΕΛΟΣ_ΑΝ
Στοίβα (stack) ονομάζεται μια δομή δεδομένων το σύνολο των στοιχείων της οποίας είναι διατεταγμένο με τέτοιο τρόπο, ώστε τα στοιχεία που βρίσκονται στην κορυφή λαμβάνονται πρώτα, ενώ αυτά που βρίσκονται στο βάθος λαμβάνονται τελευταία.
Η παραπάνω μέθοδος ονομάζεται Τελευταίο Μέσα, Πρώτο Έξω ή LIFO (= Last In First Out).
Χαρακτηριστικό παράδειγμα είναι μια στοίβα από πιάτα. Παίρνουμε προς χρήση το πιάτο που τοποθετήσαμε τελευταίο.
Οι κύριες λειτουργίες σε μια στοίβα είναι δύο:
top δείχνει στην προηγούμενη θέση.top ← top + 1 και μετά εισαγωγή του στοιχείου.top ← top - 1.Σε κενή στοίβα: top ← 0.
ΓΡΑΨΕ 'Δώσε στοιχείο για να εισαχθεί στην στοίβα Α:'
ΔΙΑΒΑΣΕ στοιχείο
ΑΝ top < 10 ΤΟΤΕ
top ← top + 1
A[top] ← στοιχείο
ΑΛΛΙΩΣ
ΓΡΑΨΕ 'Υπερχείλιση στοίβας'
ΤΕΛΟΣ_ΑΝΑΝ top >= 1 ΤΟΤΕ
ΓΡΑΨΕ Α[top]
top ← top - 1
ΑΛΛΙΩΣ
ΓΡΑΨΕ 'Υποχείλιση στοίβας'
ΤΕΛΟΣ_ΑΝΈστω στοίβα με πίνακα Α 10 θέσεων. Αρχικά top=0.
Εκτελούμε: Ώθηση(10), Ώθηση(20), Ώθηση(30), Απώθηση(), Ώθηση(40)
| Λειτουργία | top |
|---|---|
| Αρχή | 0 |
| Ώθηση(10) | 1 |
| Ώθηση(20) | 2 |
| Ώθηση(30) | 3 |
| Απώθηση() | 2 |
| Ώθηση(40) | 3 |
Τελικά: top = 3
Στοιχεία: Α[1]=10, Α[2]=20, Α[3]=40
Η top δείχνει τη θέση του τελευταίου στοιχείου που τοποθετήθηκε στην κορυφή.
top = 0 → στοίβα κενήtop = 10 (πίνακας 10 θέσεων) → στοίβα γεμάτηtopΌταν top = 0, η στοίβα είναι κενή.
Αν προσπαθήσουμε να κάνουμε Απώθηση, θα έχουμε υποχείλιση (underflow).
Έστω αρχικά top=0. Εκτελούμε:
top ← top + 1; Α[top] ← 5
top ← top + 1; Α[top] ← 10
top ← top + 1; Α[top] ← 15
top ← top - 1Αποτέλεσμα: top = 2, στοιχεία: Α[1]=5, Α[2]=10
Συνεχίζουμε (top=2):
top ← top - 1Αποτέλεσμα: top = 1, στοιχείο: Α[1]=5
Συνεχίζουμε (top=1):
ΑΝ top >= 1 ΤΟΤΕ
ΓΡΑΨΕ Α[top]
top ← top - 1
ΤΕΛΟΣ_ΑΝΑποτέλεσμα: Εμφανίζεται "5", top = 0, στοίβα κενή.
| Χαρακτηριστικό | Στοίβα | Ουρά |
|---|---|---|
| Αρχή | LIFO | FIFO |
| Εισαγωγή | Κορυφή (Push) | Πίσω άκρο (Enqueue) |
| Εξαγωγή | Κορυφή (Pop) | Εμπρός άκρο (Dequeue) |
| Παράδειγμα | Στοίβα πιάτων | Ουρά σε ταμείο |
Πλεονεκτήματα:
Μειονεκτήματα:
Από την καθημερινότητα:
Από την Πληροφορική:
Υπερχείλιση (overflow) ονομάζεται η κατάσταση κατά την οποία προσπαθούμε να κάνουμε ώθηση (push) σε μια γεμάτη στοίβα.
Π.χ. αν top = 10 σε πίνακα 10 θέσεων.
Υποχείλιση (underflow) ονομάζεται η κατάσταση κατά την οποία προσπαθούμε να κάνουμε απώθηση (pop) από μια κενή στοίβα.
Π.χ. αν top = 0.
Η στοίβα είναι γεμάτη όταν top = ΜΕΓΕΘΟΣ_ΠΙΝΑΚΑ.
ΑΝ top = 10 ΤΟΤΕ
ΓΡΑΨΕ 'Η στοίβα είναι γεμάτη'
ΤΕΛΟΣ_ΑΝΗ στοίβα είναι κενή όταν top = 0.
ΑΝ top = 0 ΤΟΤΕ
ΓΡΑΨΕ 'Η στοίβα είναι κενή'
ΤΕΛΟΣ_ΑΝΓια να αντιστρέψουμε τη λέξη "HELLO":
Για την έκφραση ((a+b)*c):
Η κλήση στοίβας (call stack) είναι μια στοίβα που χρησιμοποιείται για την εκτέλεση συναρτήσεων/υποπρογραμμάτων.
Κάθε φορά που καλείται μια συνάρτηση, αποθηκεύονται:
Στην αναδρομή, κάθε αναδρομική κλήση αποθηκεύεται στην κλήση στοίβας.
Π.χ. για 5!:
factorial(5) → factorial(4) → ... → factorial(1)Κάθε κλήση σπρώχνεται στη στοίβα. Όταν φτάσουμε στη βασική περίπτωση, αρχίζουμε να εξάγουμε και να υπολογίζουμε.
Stack Overflow είναι ένα σφάλμα που συμβαίνει όταν η κλήση στοίβας γεμίσει.
Συμβαίνει συνήθως σε:
Το backtracking είναι μια τεχνική όπου:
Η στοίβα θυμάται τις επιλογές. Παραδείγματα: λαβύρινθος, σκάκι, Sudoku.
| Δομή | Αρχή | Εισαγωγή | Εξαγωγή | Παράδειγμα |
|---|---|---|---|---|
| Στοίβα | LIFO | Κορυφή | Κορυφή | Undo, Back |
| Ουρά | FIFO | Πίσω άκρο | Εμπρός άκρο | Print queue |
| Λίστα | Καμία | Οπουδήποτε | Οπουδήποτε | Playlist |
Αρχικά top = 0. Εκτελούμε: Ώθηση(10), Ώθηση(20), Ώθηση(30), Απώθηση(), Ώθηση(40), Απώθηση()
| Λειτουργία | top | Περιεχόμενο |
|---|---|---|
| Αρχή | 0 | Κενή |
| Ώθηση(10) | 1 | Α[1]=10 |
| Ώθηση(20) | 2 | Α[1]=10, Α[2]=20 |
| Ώθηση(30) | 3 | Α[1]=10, Α[2]=20, Α[3]=30 |
| Απώθηση() | 2 | Εξάγεται το 30 |
| Ώθηση(40) | 3 | Α[3]=40 |
| Απώθηση() | 2 | Εξάγεται το 40 |
Τελικά: top = 2, στοιχεία: Α[1]=10, Α[2]=20
Συμπλήρωσε τα κενά:
Γράψε κώδικα που εισάγει 5 στοιχεία σε μια κενή στοίβα και τα εμφανίζει.
top ← 0
ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ 5
ΓΡΑΨΕ 'Δώσε στοιχείο:'
ΔΙΑΒΑΣΕ στοιχείο
ΑΝ top < 10 ΤΟΤΕ
top ← top + 1
Α[top] ← στοιχείο
ΑΛΛΙΩΣ
ΓΡΑΨΕ 'Υπερχείλιση!'
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ top
ΓΡΑΨΕ Α[i]
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣΓράψε αλγόριθμο που αντιστρέφει μια λέξη χρησιμοποιώντας στοίβα. (Δεν υπάρχει εντολή Μήκος() στη ΓΛΩΣΣΑ, οπότε ζητάμε πρώτα το πλήθος των χαρακτήρων)
top ← 0
ΓΡΑΨΕ 'Δώσε πλήθος χαρακτήρων:'
ΔΙΑΒΑΣΕ Ν
ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ Ν
ΓΡΑΨΕ 'Δώσε χαρακτήρα:'
ΔΙΑΒΑΣΕ χαρακτήρας
ΑΝ top < 100 ΤΟΤΕ
top ← top + 1
στοίβα[top] ← χαρακτήρας
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΓΡΑΨΕ 'Αντεστραμμένη λέξη:'
ΟΣΟ top >= 1
ΓΡΑΨΕ στοίβα[top]
top ← top - 1
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣΠαράδειγμα: Αν Ν=5 και δώσουμε H,E,L,L,O → Εμφανίζει O,L,L,E,H