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

32
ABSTRACT DATA TYPES (ADT) Διδάσκοντες Διδάσκοντες : Καμάρης Αθανάσιος Καμάρης Αθανάσιος Σαλαπάτας Λεωνίδας Σαλαπάτας Λεωνίδας

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

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

ABSTRACT DATA TYPES (ADT)

ΔιδάσκοντεςΔιδάσκοντες:: Καμάρης ΑθανάσιοςΚαμάρης Αθανάσιος Σαλαπάτας ΛεωνίδαςΣαλαπάτας Λεωνίδας

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

Στοίβα Στοίβα - StackStack

ΑΦΗΡΗΜΕΝΟΣ ΤΥΠΟΣ ΑΦΗΡΗΜΕΝΟΣ ΤΥΠΟΣ ΔΕΔΟΜΕΝΩΝΔΕΔΟΜΕΝΩΝ

ΔιδάσκοντεςΔιδάσκοντες:: Καμάρης ΑθανάσιοςΚαμάρης Αθανάσιος Σαλαπάτας ΛεωνίδαςΣαλαπάτας Λεωνίδας

Πράξη Δημιουργία Πράξη Κενή Πράξη Ώθηση Πράξη Εξαγωγή

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

Αποτελεί μία συλλογή αντικειμένων με γραμμική διάταξη.

Όλες οι εισαγωγέςεισαγωγές (pushes) και εξαγωγέςεξαγωγές (pops) πραγματοποιούνται από το ένα άκρο που ονομάζεται κορυφήκορυφή (top) της στοίβας.

Αντίθετα, το άλλο άκρο παραμένει σταθερό και αποτελεί τη βάσηβάση (bottom) της στοίβας.

3

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

ΧΑΡΑΚΤΗΡΙΣΤΙΚΗ ΙΔΙΟΤΗΤΑ της ΣΤΟΙΒΑΣ

Το τελευταίο στοιχείο που εισήχθη είναι το πρώτο που θα εξαχθεί.

Αποτελεί, κατ’ ουσίαν, μία LIFOLIFO (Last In First Out) λίσταλίστα.

Οπότε, για να αφαιρεθεί ένα αντικείμενο, πρέπει να αφαιρεθούν όλα τα αντικείμενα που βρίσκονται πάνω του.

Συνεπώς, ένα αντικείμενο τοποθετείται μόνο στην κορυφή (top) της στοίβας ή εξάγεται μόνο από την κορυφή (top) αυτής.

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

4 είναι οι βασικές πράξεις του ΑΤΔ Στοίβα:◦ ΔημιουργίαΔημιουργία στοίβας◦ Έλεγχος κενήςκενής στοίβας◦ Εισαγωγή στη στοίβα (ώθησηώθηση – push)◦ ΕξαγωγήΕξαγωγή από την στοίβα (pop)

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

ΑΤΔ ΣΤΟΙΒΑ ΑΤΔ ΣΤΟΙΒΑ Βασικές Πράξεις

ΔημιουργίαΔημιουργία ΚενήΚενή ΏθησηΏθησηpushpush

ΕξαγωγήΕξαγωγήpoppop

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

Τις πράξεις αυτές θα τις υλοποιήσουμε χρησιμοποιώντας τη γλώσσα προγραμματισμού CC.

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

Η υλοποίηση αφορά στην πιο απλή μορφή του ΑΤΔ Στοίβα χρησιμοποιώντας τη δομή του πίνακα:

#define PLITHOS ... /* το μέγεθος του πίνακα */typedef ... typos_stoixeiou; /* ο τύπος των στοιχείων του

πίνακα */typedef typos_stoixeiou typos_pinaka [PLITHOS];typedef struct {

int top;typos_pinaka pinakas;

} typos_stoivas;

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

Πράξη ΔημιουργίαΔημιουργία

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

Η πράξη ΔημιουργίαΔημιουργία, δημιουργεί μία νέα κενή στοίβα.

void dimiourgia (typos_stoivas *stoiva){

stoiva->top = -1;}

Πράξη Πράξη ΔημιουργίαΔημιουργία

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

Στα αριστερά φαίνεται μία νέα κενή στοίβα.

Ο πίνακας της στοίβας στη μνήμη (αριστερά επάνω) και η γραφική απεικόνισή της (αριστερά κάτω).

Πράξη Πράξη ΔημιουργίαΔημιουργία

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

Πράξη ΚενήΚενή

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

Η πράξη ΚενήΚενή, επιστρέφει την τιμή 1 εάν η στοίβα είναι κενή (δεν έχει στοιχεία) ή την τιμή 0 εάν έχει έστω ένα στοιχείο.

int keni (typos_stoivas stoiva){

return (stoiva.korifi == -1);}

Πράξη Πράξη ΚενήΚενή

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

Πράξη Ώθηση Ώθηση ((pushpush))

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

Η λειτουργία της πράξης ΏθησηΏθηση (ppushush) αποτελείται από 3 ενέργειες:

1. Αν η στοίβα είναι γεμάτη, τότε τυπώνεται ένα μήνυμα και σταματά η εκτέλεση του προγράμματος.

2. Η κορυφή (top) δείχνει στην επόμενη θέση.3. Εισάγεται το νέο στοιχείο στη θέση που δείχνει,

πλέον, η κορυφή (top).

Πράξη Πράξη ΏθησηΏθηση ( (pushpush))

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

Η πράξη ΏθησηΏθηση (push) (push):

void push (typos_stoivas *stoiva, typos_stoixeiou stoixeio) {if (stoiva->top == PLITHOS-1)

printf (“Η στοίβα είναι γεμάτη“);else {

stoiva->top++;stoiva->pinakas [stoiva->top] = stoixeio;

}}

Πράξη Πράξη ΏθησηΏθηση ( (pushpush))

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

Στα αριστερά φαίνεται η ώθηση του πρώτου στοιχείου στην κενή στοίβα.

Αριστερά επάνω: ο πίνακας της στοίβας στη μνήμη.Αριστερά κάτω: η γραφική απεικόνισή της.

Πράξη Πράξη ΏθησηΏθηση ( (pushpush))

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

Ακολούθως, η ώθηση του δεύτερου στοιχείου στην, πλέον, μη κενή στοίβα.

Αριστερά επάνω: ο πίνακας της στοίβας στη μνήμη.Αριστερά κάτω: η γραφική απεικόνισή της.

Πράξη Πράξη ΏθησηΏθηση ( (pushpush))

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

Και ούτω καθεξής. Παρατηρείστε ότι η μεταβλητή toptop αλλάζει καθώς ωθούνται νέα στοιχεία στη στοίβα.

Αριστερά επάνω: ο πίνακας της στοίβας στη μνήμη.Αριστερά κάτω: η γραφική απεικόνισή της.

Πράξη Πράξη ΏθησηΏθηση ( (pushpush))

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

Μία διαφορετική υλοποίηση της πράξης ΏθησηΏθηση (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

}}

Πράξη Πράξη ΏθησηΏθηση ( (pushpush))

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

Αντίστοιχα, στο κύριο πρόγραμμα, από όπου και καλείται η πράξη Ώθηση (Ώθηση (pushpush)), γράφεται ο κώδικας:

push (&stoiva, stoixeio, &overflow);if (overflow)

/* να γίνει διορθωτική ενέργεια */else

/* To stoixeio εισήχθη επιτυχώς στη στοίβα */

Πράξη Πράξη ΏθησηΏθηση ( (pushpush))

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

Η περίπτωση ώθησης ενόσω η στοίβα είναι γεμάτη.

Το στοιχείο δεν θα εισαχθεί στη στοίβα, αλλά ανάλογα με τον αλγόριθμο θα τυπωθεί μήνυμα σφάλματος ή θα συμβεί υπερχείλιση (overflow).

Αριστερά επάνω: ο πίνακας της στοίβας στη μνήμη.Αριστερά κάτω: η γραφική απεικόνισή της.

Πράξη Πράξη ΏθησηΏθηση ( (pushpush))

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

Πράξη Εξαγωγή Εξαγωγή ((poppop))

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

Η λειτουργία της πράξης ΕξαγωγήΕξαγωγή (poppop) αποτελείται, όπως και η Ώθηση, από 3 ενέργειες:

1. Αν η στοίβα είναι κενή, τότε τυπώνεται ένα μήνυμα και σταματά η εκτέλεση του προγράμματος.

2. Εξάγεται το στοιχείο που δείχνει η κορυφή (top) από τη στοίβα.

3. Επιστρέφει την τιμή του στοιχείου που εξάχθηκε, στο κύριο πρόγραμμα.

Πράξη Πράξη ΕξαγωγήΕξαγωγή ( (poppop))

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

Η πράξη ΕξαγωγήΕξαγωγή (pop) (pop):

void pop (typos_stoivas *stoiva, typos_stoixeiou *stoixeio) {if (keni (*stoiva))

printf(“Η στοίβα είναι άδεια“);else {

*stoixeio=stoiva->pinakas [stoiva->top];stoiva->top--;}

}

Πράξη Πράξη ΕξαγωγήΕξαγωγή ( (poppop))

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

Εξαγωγή του πρώτου στοιχείου από τη γεμάτη στοίβα.

Αριστερά επάνω: ο πίνακας της στοίβας στη μνήμη.Αριστερά κάτω: η γραφική απεικόνισή της.

Πράξη Πράξη ΕξαγωγήΕξαγωγή ( (poppop))

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

Και ούτω καθεξής. Παρατηρείστε ότι η μεταβλητή toptop αλλάζει καθώς εξάγονται στοιχεία από τη στοίβα.

Αριστερά επάνω: ο πίνακας της στοίβας στη μνήμη.Αριστερά κάτω: η γραφική απεικόνισή της.

Πράξη Πράξη ΕξαγωγήΕξαγωγή ( (poppop))

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

Εξαγωγή και του τελευταίου στοιχείου από τη στοίβα. Τώρα, πλέον, η στοίβα είναι άδεια.

Αριστερά επάνω: ο πίνακας της στοίβας στη μνήμη.Αριστερά κάτω: η γραφική απεικόνισή της.

Πράξη Πράξη ΕξαγωγήΕξαγωγή ( (poppop))

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

Μία διαφορετική υλοποίηση της πράξης Εξαγωγή (Εξαγωγή (poppop)), είναι η χρήση, όπως και στην Ώθηση, λογικής μεταβλητής, αντί μηνύματος, για τον χειρισμό της περίπτωσης όπου η στοίβα είναι κενή.

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 --;

}}

Πράξη Πράξη ΕξαγωγήΕξαγωγή ( (poppop))

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

Αντίστοιχα, στο κύριο πρόγραμμα, από όπου και καλείται η πράξη Εξαγωγή (Εξαγωγή (poppop)), γράφεται ο κώδικας:

pop (&stoiva, &stoixeio, &underflow);if (underflow)

/* να γίνει διορθωτική ενέργεια */else

/* stoixeio είναι το στοιχείο που εξάγεται από τη στοίβα */

Πράξη Πράξη ΕξαγωγήΕξαγωγή ( (poppop))

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

Απόπειρα εξαγωγής στοιχείου από κενή στοίβα.

Δεν θα γίνει καμία εξαγωγή, αντιθέτως και ανάλογα με τον αλγόριθμο θα τυπωθεί μήνυμα σφάλματος ή θα συμβεί υποχείλιση (underflow).

Αριστερά επάνω: ο πίνακας της στοίβας στη μνήμη.Αριστερά κάτω: η γραφική απεικόνισή της.

Πράξη Πράξη ΕξαγωγήΕξαγωγή ( (poppop))

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

Στοίβα Στοίβα - StackStack

ΑΦΗΡΗΜΕΝΟΣ ΤΥΠΟΣ ΑΦΗΡΗΜΕΝΟΣ ΤΥΠΟΣ ΔΕΔΟΜΕΝΩΝΔΕΔΟΜΕΝΩΝ

ΔιδάσκοντεςΔιδάσκοντες:: Καμάρης ΑθανάσιοςΚαμάρης Αθανάσιος Σαλαπάτας ΛεωνίδαςΣαλαπάτας Λεωνίδας