Αποτελεί μία συλλογήαντικειμένων με γραμμική διάταξη. Όλες οι εισαγωγές ( pushes) και εξαγωγές (pops) πραγματοποιούνται από το ένα άκρο που ονομάζεται κορυφή ( top) της στοίβας. Αντίθετα , το άλλο άκρο παραμένει σταθερό και αποτελεί τη βάση ( bottom) της στοίβας.
4.
ΧΑΡΑΚΤΗΡΙΣΤΙΚΗ ΙΔΙΟΤΗΤΑ τηςΣΤΟΙΒΑΣ Το τελευταίο στοιχείο που εισήχθη είναι το πρώτο που θα εξαχθεί. Αποτελεί, κατ’ ουσίαν, μία LIFO (Last In First Out) λίστα . Οπότε, για να αφαιρεθεί ένα αντικείμενο, πρέπει να αφαιρεθούν όλα τα αντικείμενα που βρίσκονται πάνω του. Συνεπώς, ένα αντικείμενο τοποθετείται μόνο στην κορυφή ( top) της στοίβας ή εξάγεται μόνο από την κορυφή ( top) αυτής.
5.
4 είναι οιβασικές πράξεις του ΑΤΔ Στοίβα: Δημιουργία στοίβας Έλεγχος κενής στοίβας Εισαγωγή στη στοίβα ( ώθηση – push) Εξαγωγή από την στοίβα ( pop)
6.
ΑΤΔ ΣΤΟΙΒΑ Βασικές Πράξεις Δημιουργία Κενή Ώθηση push Εξαγωγή pop
7.
Τις πράξεις αυτέςθα τις υλοποιήσουμε χρησιμοποιώντας τη γλώσσα προγραμματισμού C .
8.
Η υλοποίηση αφοράστην πιο απλή μορφή του ΑΤΔ Στοίβα χρησιμοποιώντας τη δομή του πίνακα: #define PLITHOS ... /* το μέγεθος του πίνακα */ typedef ... typos_stoixeiou; /* ο τύπος των στοιχείων του πίνακα */ typedef typos_stoixeiou typos_pinaka [PLITHOS]; typedef struct { int top; typos_pinaka pinakas; } typos_stoivas;
Η πράξη Δημιουργία , δημιουργεί μία νέα κενή στοίβα. void dimiourgia (typos_stoivas *stoiva) { stoiva->top = -1; } Πράξη Δημιουργία
11.
Στα αριστερά φαίνεταιμία νέα κενή στοίβα. Ο πίνακας της στοίβας στη μνήμη (αριστερά επάνω) και η γραφική απεικόνισή της (αριστερά κάτω) . Πράξη Δημιουργία
Η πράξη Κενή , επιστρέφει την τιμή 1 εάν η στοίβα είναι κενή (δεν έχει στοιχεία) ή την τιμή 0 εάν έχει έστω ένα στοιχείο. int keni (typos_stoivas stoiva) { return (stoiva.korifi == -1); } Πράξη Κενή
Η λειτουργία τηςπράξης Ώθηση ( p ush ) αποτελείται από 3 ενέργειες: Αν η στοίβα είναι γεμάτη, τότε τυπώνεται ένα μήνυμα και σταματά η εκτέλεση του προγράμματος. Η κορυφή ( top ) δείχνει στην επόμενη θέση. Εισάγεται το νέο στοιχείο στη θέση που δείχνει, πλέον, η κορυφή ( top ). Πράξη Ώθηση ( push )
16.
Η πράξη Ώθηση (push) : void push (typos_stoivas *stoiva, typos_stoixeiou stoixeio) { if (stoiva-> top == PLITHOS -1) printf (“Η στοίβα είναι γεμάτη“); e lse { stoiva-> top ++; stoiva->pinakas [stoiva-> top ] = stoixeio; } } Πράξη Ώθηση ( push )
17.
Στα αριστερά φαίνεταιη ώθηση του πρώτου στοιχείου στην κενή στοίβα. Αριστερά επάνω: ο πίνακας της στοίβας στη μνήμη. Αριστερά κάτω : η γραφική απεικόνισή της. Πράξη Ώθηση ( push )
18.
Ακολούθως, η ώθησητου δεύτερου στοιχείου στην, πλέον, μη κενή στοίβα. Αριστερά επάνω: ο πίνακας της στοίβας στη μνήμη. Αριστερά κάτω : η γραφική απεικόνισή της. Πράξη Ώθηση ( push )
19.
Και ούτω καθεξής.Παρατηρείστε ότι η μεταβλητή top αλλάζει καθώς ωθούνται νέα στοιχεία στη στοίβα. Αριστερά επάνω: ο πίνακας της στοίβας στη μνήμη. Αριστερά κάτω : η γραφική απεικόνισή της. Πράξη Ώθηση ( push )
20.
Μία διαφορετική υλοποίησητης πράξης Ώθηση (push) , είναι η χρήση λογικής μεταβλητής, αντί μηνύματος, για τον χειρισμό της περίπτωσης όπου η στοίβα είναι γεμάτη. void push (typos_stoivas *stoiva, typos_stoixeiou stoixeio, int * overflow ) { /* αν η στοίβα είναι πλήρης τότε η τιμή της overflow γίνεται 1, αλλιώς 0*/ if (stoiva-> top == PLITHOS -1) * overflow = 1; else { * overflow = 0; stoiva-> top ++; stoiva->pinakas [stoiva-> top ]=stoixeio } } Πράξη Ώθηση ( push )
21.
Αντίστοιχα, στο κύριοπρόγραμμα, από όπου και καλείται η πράξη Ώθηση ( push ) , γράφεται ο κώδικας: push (&stoiva, stoixeio, &overflow); if (overflow) /* να γίνει διορθωτική ενέργεια */ else /* To stoixeio εισήχθη επιτυχώς στη στοίβα */ Πράξη Ώθηση ( push )
22.
Η περίπτωση ώθησηςενόσω η στοίβα είναι γεμάτη. Το στοιχείο δεν θα εισαχθεί στη στοίβα, αλλά ανάλογα με τον αλγόριθμο θα τυπωθεί μήνυμα σφάλματος ή θα συμβεί υπερχείλιση ( overflow ) . Αριστερά επάνω: ο πίνακας της στοίβας στη μνήμη. Αριστερά κάτω : η γραφική απεικόνισή της. Πράξη Ώθηση ( push )
Η λειτουργία τηςπράξης Εξαγωγή ( pop ) αποτελείται, όπως και η Ώθηση, από 3 ενέργειες: Αν η στοίβα είναι κενή, τότε τυπώνεται ένα μήνυμα και σταματά η εκτέλεση του προγράμματος. Εξάγεται το στοιχείο που δείχνει η κορυφή ( top ) από τη στοίβα. Επιστρέφει την τιμή του στοιχείου που εξάχθηκε , στο κύριο πρόγραμμα. Πράξη Εξαγωγή ( pop )
25.
Η πράξη Εξαγωγή (pop) : v oid pop (typos_stoivas *stoiva, typos_stoixeiou *stoixeio) { if (keni (*stoiva)) printf(“Η στοίβα είναι άδεια“); e lse { *stoixeio=stoiva->pinakas [stoiva-> top ]; stoiva-> top -- ; } } Πράξη Εξαγωγή ( pop )
26.
Εξαγωγή του πρώτουστοιχείου από τη γεμάτη στοίβα. Αριστερά επάνω: ο πίνακας της στοίβας στη μνήμη. Αριστερά κάτω : η γραφική απεικόνισή της. Πράξη Εξαγωγή ( pop )
27.
Και ούτω καθεξής.Παρατηρείστε ότι η μεταβλητή top αλλάζει καθώς εξάγονται στοιχεία από τη στοίβα. Αριστερά επάνω: ο πίνακας της στοίβας στη μνήμη. Αριστερά κάτω : η γραφική απεικόνισή της. Πράξη Εξαγωγή ( pop )
28.
Εξαγωγή και τουτελευταίου στοιχείου από τη στοίβα. Τώρα, πλέον, η στοίβα είναι άδεια. Αριστερά επάνω: ο πίνακας της στοίβας στη μνήμη. Αριστερά κάτω : η γραφική απεικόνισή της. Πράξη Εξαγωγή ( pop )
29.
Μία διαφορετική υλοποίησητης πράξης Εξαγωγή ( pop ) , είναι η χρήση, όπως και στην Ώθηση, λογικής μεταβλητής, αντί μηνύματος, για τον χειρισμό της περίπτωσης όπου η στοίβα είναι κενή. void pop (typos_stoivas *stoiva, typos_stoixeiou *stoixeio, int *underflow) { if (keni (*stoiva)) *underflow = 1; else { *underflow = 0; *stoixeio = stoiva->pinakas [stoiva->top]; stoiva->top = stoiva->top --; } } Πράξη Εξαγωγή ( pop )
30.
Αντίστοιχα, στο κύριοπρόγραμμα, από όπου και καλείται η πράξη Εξαγωγή ( pop ) , γράφεται ο κώδικας: pop (&stoiva, &stoixeio, &underflow); if (underflow) /* να γίνει διορθωτική ενέργεια */ else /* stoixeio είναι το στοιχείο που εξάγεται από τη στοίβα */ Πράξη Εξαγωγή ( pop )
31.
Απόπειρα εξαγωγής στοιχείουαπό κενή στοίβα. Δεν θα γίνει καμία εξαγωγή, αντιθέτως και ανάλογα με τον αλγόριθμο θα τυπωθεί μήνυμα σφάλματος ή θα συμβεί υποχείλιση ( underflow ) . Αριστερά επάνω: ο πίνακας της στοίβας στη μνήμη. Αριστερά κάτω : η γραφική απεικόνισή της. Πράξη Εξαγωγή ( pop )