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

Post on 17-Jul-2015

1.640 views 0 download

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

ABSTRACT DATA TYPES (ADT)

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

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

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

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

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

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

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

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

3

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

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

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

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

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

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

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

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

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

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

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

#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);}

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

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

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

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

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

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

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

Η πράξη ΏθησηΏθηση (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))

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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