ABSTRACT DATA TYPES (ADT) Διδάσκοντες : Καμάρης Αθανάσιος Σαλαπάτας Λεωνίδας
Στοίβα  -   Stack ΑΦΗΡΗΜΕΝΟΣ ΤΥΠΟΣ ΔΕΔΟΜΕΝΩΝ Πράξη Δημιουργία Πράξη Κενή Πράξη Ώθηση Πράξη Εξαγωγή Διδάσκοντες : Καμάρης Αθανάσιος Σαλαπάτας Λεωνίδας
Αποτελεί μία συλλογή αντικειμένων με γραμμική διάταξη. Όλες οι  εισαγωγές  ( pushes)  και  εξαγωγές  (pops)  πραγματοποιούνται από το ένα άκρο που ονομάζεται  κορυφή  ( top)  της στοίβας. Αντίθετα ,  το άλλο άκρο παραμένει σταθερό και αποτελεί τη  βάση  ( bottom)  της στοίβας.
ΧΑΡΑΚΤΗΡΙΣΤΙΚΗ ΙΔΙΟΤΗΤΑ της ΣΤΟΙΒΑΣ Το τελευταίο στοιχείο που εισήχθη είναι το πρώτο που θα εξαχθεί. Αποτελεί, κατ’ ουσίαν, μία  LIFO  (Last In First Out)  λίστα . Οπότε, για να αφαιρεθεί ένα αντικείμενο, πρέπει να αφαιρεθούν όλα τα αντικείμενα που βρίσκονται πάνω του. Συνεπώς, ένα αντικείμενο τοποθετείται μόνο στην κορυφή ( top)  της στοίβας ή εξάγεται   μόνο από την κορυφή ( top)  αυτής.
4 είναι οι βασικές πράξεις του ΑΤΔ Στοίβα: Δημιουργία  στοίβας Έλεγχος  κενής  στοίβας Εισαγωγή στη στοίβα ( ώθηση  –  push) Εξαγωγή  από την στοίβα ( pop)
ΑΤΔ ΣΤΟΙΒΑ  Βασικές Πράξεις Δημιουργία Κενή Ώθηση push Εξαγωγή pop
Τις πράξεις αυτές θα τις υλοποιήσουμε χρησιμοποιώντας τη γλώσσα προγραμματισμού  C .
Η υλοποίηση αφορά στην πιο απλή μορφή του ΑΤΔ Στοίβα χρησιμοποιώντας τη δομή του πίνακα: #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; } Πράξη  Δημιουργία
Στα αριστερά φαίνεται μία νέα κενή στοίβα. Ο πίνακας της στοίβας στη μνήμη  (αριστερά επάνω)  και η γραφική απεικόνισή της  (αριστερά κάτω) . Πράξη  Δημιουργία
Πράξη   Κενή
Η πράξη  Κενή , επιστρέφει την τιμή 1 εάν η στοίβα είναι κενή (δεν έχει στοιχεία) ή την τιμή 0 εάν έχει έστω ένα στοιχείο. int keni (typos_stoivas stoiva) { return (stoiva.korifi == -1); } Πράξη  Κενή
Πράξη   Ώθηση  ( push )
Η λειτουργία της πράξης  Ώθηση  ( p ush ) αποτελείται από 3 ενέργειες: Αν η στοίβα είναι γεμάτη, τότε τυπώνεται ένα μήνυμα και σταματά η εκτέλεση του προγράμματος. Η  κορυφή  ( top ) δείχνει στην επόμενη θέση. Εισάγεται το νέο στοιχείο στη θέση που δείχνει, πλέον, η  κορυφή  ( top ). Πράξη  Ώθηση  ( push )
Η πράξη  Ώθηση  (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 )
Στα αριστερά φαίνεται η ώθηση του πρώτου στοιχείου στην κενή στοίβα. Αριστερά επάνω:  ο πίνακας της στοίβας στη μνήμη. Αριστερά κάτω : η γραφική απεικόνισή της. Πράξη  Ώθηση  ( push )
Ακολούθως, η ώθηση του δεύτερου στοιχείου στην, πλέον, μη κενή στοίβα. Αριστερά επάνω:  ο πίνακας της στοίβας στη μνήμη. Αριστερά κάτω : η γραφική απεικόνισή της. Πράξη  Ώθηση  ( push )
Και ούτω καθεξής. Παρατηρείστε ότι η μεταβλητή  top  αλλάζει καθώς ωθούνται νέα στοιχεία στη στοίβα. Αριστερά επάνω:  ο πίνακας της στοίβας στη μνήμη. Αριστερά κάτω : η γραφική απεικόνισή της. Πράξη  Ώθηση  ( push )
Μία διαφορετική υλοποίηση της πράξης  Ώθηση  (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 )
Αντίστοιχα, στο κύριο πρόγραμμα, από όπου και καλείται η πράξη  Ώθηση ( push ) ,   γράφεται ο κώδικας: push (&stoiva, stoixeio, &overflow); if (overflow) /*  να γίνει διορθωτική ενέργεια  */ else /*   To  stoixeio  εισήχθη επιτυχώς στη στοίβα  */ Πράξη  Ώθηση  ( push )
Η περίπτωση ώθησης ενόσω η στοίβα είναι γεμάτη. Το στοιχείο δεν θα εισαχθεί στη στοίβα, αλλά ανάλογα με τον αλγόριθμο θα τυπωθεί μήνυμα σφάλματος ή θα συμβεί  υπερχείλιση   ( overflow ) . Αριστερά επάνω:  ο πίνακας της στοίβας στη μνήμη. Αριστερά κάτω : η γραφική απεικόνισή της. Πράξη  Ώθηση  ( push )
Πράξη   Εξαγωγή  ( pop )
Η λειτουργία της πράξης  Εξαγωγή  ( pop ) αποτελείται, όπως και η Ώθηση, από 3 ενέργειες: Αν η στοίβα είναι κενή, τότε τυπώνεται ένα μήνυμα και σταματά η εκτέλεση του προγράμματος. Εξάγεται το στοιχείο που δείχνει η  κορυφή  ( top ) από τη στοίβα. Επιστρέφει την τιμή του στοιχείου που εξάχθηκε ,  στο κύριο πρόγραμμα. Πράξη  Εξαγωγή  ( pop )
Η πράξη  Εξαγωγή  (pop) : v oid  pop  (typos_stoivas *stoiva, typos_stoixeiou *stoixeio)   { if (keni   (*stoiva)) printf(“Η στοίβα είναι άδεια“); e lse   { *stoixeio=stoiva->pinakas   [stoiva-> top ]; stoiva-> top -- ; } } Πράξη  Εξαγωγή  ( pop )
Εξαγωγή του πρώτου στοιχείου από τη γεμάτη στοίβα. Αριστερά επάνω:  ο πίνακας της στοίβας στη μνήμη. Αριστερά κάτω : η γραφική απεικόνισή της. Πράξη  Εξαγωγή  ( pop )
Και ούτω καθεξής. Παρατηρείστε ότι η μεταβλητή  top  αλλάζει καθώς εξάγονται στοιχεία από τη στοίβα. Αριστερά επάνω:  ο πίνακας της στοίβας στη μνήμη. Αριστερά κάτω : η γραφική απεικόνισή της. Πράξη  Εξαγωγή  ( pop )
Εξαγωγή και του τελευταίου στοιχείου από τη στοίβα. Τώρα, πλέον, η στοίβα είναι άδεια. Αριστερά επάνω:  ο πίνακας της στοίβας στη μνήμη. Αριστερά κάτω : η γραφική απεικόνισή της. Πράξη  Εξαγωγή  ( pop )
Μία διαφορετική υλοποίηση της πράξης  Εξαγωγή ( 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 )
Αντίστοιχα, στο κύριο πρόγραμμα, από όπου και καλείται η πράξη  Εξαγωγή ( pop ) ,   γράφεται ο κώδικας: pop (&stoiva, &stoixeio, &underflow); if (underflow) /*  να γίνει διορθωτική ενέργεια  */ else /*   stoixeio  είναι το στοιχείο που εξάγεται από  τη στοίβα  */ Πράξη  Εξαγωγή  ( pop )
Απόπειρα εξαγωγής στοιχείου από κενή στοίβα. Δεν θα γίνει καμία εξαγωγή, αντιθέτως και ανάλογα με τον αλγόριθμο θα τυπωθεί μήνυμα σφάλματος ή θα συμβεί  υποχείλιση   ( underflow ) . Αριστερά επάνω:  ο πίνακας της στοίβας στη μνήμη. Αριστερά κάτω : η γραφική απεικόνισή της. Πράξη  Εξαγωγή  ( pop )
Στοίβα  -   Stack ΑΦΗΡΗΜΕΝΟΣ ΤΥΠΟΣ ΔΕΔΟΜΕΝΩΝ Διδάσκοντες : Καμάρης Αθανάσιος Σαλαπάτας Λεωνίδας

ADT Stack - ΑΤΔ Στοίβα

  • 1.
    ABSTRACT DATA TYPES(ADT) Διδάσκοντες : Καμάρης Αθανάσιος Σαλαπάτας Λεωνίδας
  • 2.
    Στοίβα - Stack ΑΦΗΡΗΜΕΝΟΣ ΤΥΠΟΣ ΔΕΔΟΜΕΝΩΝ Πράξη Δημιουργία Πράξη Κενή Πράξη Ώθηση Πράξη Εξαγωγή Διδάσκοντες : Καμάρης Αθανάσιος Σαλαπάτας Λεωνίδας
  • 3.
    Αποτελεί μία συλλογήαντικειμένων με γραμμική διάταξη. Όλες οι εισαγωγές ( 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;
  • 9.
    Πράξη Δημιουργία
  • 10.
    Η πράξη Δημιουργία , δημιουργεί μία νέα κενή στοίβα. void dimiourgia (typos_stoivas *stoiva) { stoiva->top = -1; } Πράξη Δημιουργία
  • 11.
    Στα αριστερά φαίνεταιμία νέα κενή στοίβα. Ο πίνακας της στοίβας στη μνήμη (αριστερά επάνω) και η γραφική απεικόνισή της (αριστερά κάτω) . Πράξη Δημιουργία
  • 12.
    Πράξη Κενή
  • 13.
    Η πράξη Κενή , επιστρέφει την τιμή 1 εάν η στοίβα είναι κενή (δεν έχει στοιχεία) ή την τιμή 0 εάν έχει έστω ένα στοιχείο. int keni (typos_stoivas stoiva) { return (stoiva.korifi == -1); } Πράξη Κενή
  • 14.
    Πράξη Ώθηση ( push )
  • 15.
    Η λειτουργία τηςπράξης Ώθηση ( 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 )
  • 23.
    Πράξη Εξαγωγή ( pop )
  • 24.
    Η λειτουργία τηςπράξης Εξαγωγή ( 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 )
  • 32.
    Στοίβα - Stack ΑΦΗΡΗΜΕΝΟΣ ΤΥΠΟΣ ΔΕΔΟΜΕΝΩΝ Διδάσκοντες : Καμάρης Αθανάσιος Σαλαπάτας Λεωνίδας