Διάλεξη 05: Αφηρημένοι Τύποι Δεδομένων

Σχετικά έγγραφα
ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 5. Αφηρημένοι Τύποι Δεδομένων / Στοίβες και Ουρές

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Βασικές Δομές Δεδομένων

Διάλεξη 9: Αφηρημένοι Τύποι Δεδομένων. Διδάσκων: Παναγιώτης Ανδρέου

Βασικές οµές εδοµένων

Δομές Δεδομένων (Data Structures)

Διάλεξη 07: Λίστες Ι Υλοποίηση & Εφαρμογές

Οι βασικές λειτουργίες (ή πράξεις) που γίνονται σε μια δομή δεδομένων είναι:

Διάλεξη 11: Φροντιστήριο για Στοίβες. Διδάσκων: Παναγιώτης Ανδρέου. ΕΠΛ035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ.

Δομές Δεδομένων & Αλγόριθμοι

Δομές Δεδομένων & Ανάλυση Αλγορίθμων. 3ο Εξάμηνο. Ουρά (Queue) Υλοποίηση της με τη βοήθεια πίνακα.

Διάλεξη 06: Συνδεδεμένες Λίστες & Εφαρμογές Στοιβών και Ουρών

Oι βασικές πράξεις (λειτουργίες) που ορίζονται για τον τύπο στοίβα αναφέρονται παρακάτω:

Διάλεξη 16: Σωροί. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Ουρές Προτεραιότητας - Ο ΑΤΔ Σωρός, Υλοποίηση και πράξεις

Συλλογές, Στοίβες και Ουρές

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ. Δηµοσθένης Σταµάτης Τµήµα Πληροφορικής

Τύποι Δεδομένων και Απλές Δομές Δεδομένων. Παύλος Εφραιμίδης V1.0 ( )

Υλοποίηση Λιστών. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα:

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ Κεφάλαιο 3 ο

Στοίβες με Δυναμική Δέσμευση Μνήμης

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ

Διδάσκων: Παναγιώτης Ανδρέου

Διάλεξη 08: Λίστες ΙΙ Κυκλικές Λίστες

Σύνοψη Προηγούμενου (1/2) Στοίβες, Ουρές, Ουρές Προτεραιότητας. Σύνοψη Προηγούμενου (2/2) Σημερινό Μάθημα. Πίνακες. Εισαγωγή, σε χρόνο O(1).

Ενότητα 2 Στοίβες Ουρές - Λίστες. ΗΥ240 - Παναγιώτα Φατούρου 1

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων

Στοίβες Ουρές - Λίστες

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Διάλεξη 12: Λίστες Υλοποίηση & Εφαρμογές. Διδάσκων: Παναγιώτης Ανδρέου

ιαφάνειες παρουσίασης #11

υναµικές οµές εδοµένων

Διδάσκων: Παναγιώτης Ανδρέου

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Οι δομές δεδομένων στοίβα και ουρά

Διάλεξη 16: Σωροί. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Ουρές Προτεραιότητας - Ο ΑΤΔ Σωρός, Υλοποίηση και πράξεις

Διάλεξη 26: Σωροί. Διδάσκων: Παναγιώτης Ανδρέου

Διάλεξη 08: Λίστες ΙΙ Κυκλικές Λίστες

Κατ οίκον Εργασία 2 Σκελετοί Λύσεων

Δοµές Δεδοµένων. 6η Διάλεξη Αναδροµικές Εξισώσεις και Αφηρηµένοι Τύποι Δεδοµένων. Ε. Μαρκάκης

ΠΛΗ111. Ανοιξη Μάθηµα 5 ο. Ουρά. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

2.2.5 ΑΝΑΠΑΡΑΣΤΑΣΗ ΑΛΓΟΡΙΘΜΟΥ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Δομές δεδομένων. Ενότητα 2η: Στοίβες Ουρές - Λίστες Παναγιώτα Φατούρου Τμήμα Επιστήμης Υπολογιστών

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ ΟΝΟΜΑΤΕΠΩΝΥΜΟ:

Δηµοσθένης Σταµάτης Τµήµα Πληροφορικής T.E.I. ΘΕΣΣΑΛΟΝΙΚΗΣ

Διάλεξη 15: Αναδρομή (Recursion) Διδάσκων: Παναγιώτης Ανδρέου

Βασικές Έννοιες Δοµών Δεδοµένων

Διάλεξη 10: Δομές Δεδομένων Ι (Στοίβες & Ουρές)

Διάλεξη 12: Δέντρα ΙΙ Δυαδικά Δέντρα

Απλές Δοµές Δεδοµένων Στην ενότητα αυτή θα γνωρίσουµε ορισµένες απλές Δοµές Δεδοµένων και θα τις χρησιµοποιήσουµε για την αποδοτική επίλυση του προβλή

Δομές Δεδομένων. Ενότητα 3: Ουρές Εισαγωγή-Υλοποίηση ΑΤΔ Ουρά με πίνακα. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής.

Δομές Δεδομένων Ενότητα 4

Στοίβες - Ουρές. Στοίβα (stack) Γιάννης Θεοδωρίδης, Νίκος Πελέκης, Άγγελος Πικράκης Τµήµα Πληροφορικής

ΚΕΦΑΛΑΙΟ 3 ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΑΛΓΟΡΙΘΜΟΙ

Ενότητα 2 Στοίβες Ουρές - Λίστες

Κλάσεις στη Java. Στοίβα - Stack. Δήλωση της κλάσης. ΗκλάσηVector της Java. Ηκλάση Stack

ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

Εργαστήριο 4: Υλοποίηση Αφηρημένου Τύπου Δεδομένων: Ταξινομημένη Λίστα

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

Σύνοψη Προηγούμενου. Λίστες (Lists) Συνδεδεμένες Λίστες: Εισαγωγή (1/2) Συνδεδεμένες Λίστες. Ορέστης Τελέλης

Κλάσεις στη Java. Παύλος Εφραιμίδης. Java Κλάσεις στη Java 1

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Δομές Δεδομένων. Ιωάννης Γ. Τόλλης Τμήμα Επιστήμης Υπολογιστών Πανεπιστήμιο Κρήτης

Διάλεξη 08: ΛίστεςΙΙ Κυκλικές Λίστες. Διδάσκων: Παναγιώτης Ανδρέου

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

POINTERS, AGGREGATION, COMPOSITION

ΕΡΓΑΣΤΗΡΙΟ 5 ΣΗΜΕΙΩΣΕΙΣ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

public class ArrayStack implements Stack {

Δομές Δεδομένων. Ενότητα 2: Στοίβες Εισαγωγή-Υλοποίηση ΑΤΔ Στοίβα με Πίνακα-Εφαρμογή Στοίβας: Αντίστροφη Πολωνική Γραφή. Καθηγήτρια Μαρία Σατρατζέμη

Διάλεξη 16: Σωροί. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Ουρές Προτεραιότητας - Ο ΑΤΔ Σωρός, Υλοποίηση και πράξεις

ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 4-1

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

3 ΟΥ και 9 ΟΥ ΚΕΦΑΛΑΙΟΥ

Οντοκεντρικός Προγραμματισμός

Φροντιστήριο 4 Σκελετοί Λύσεων

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΘΕΩΡΗΤΙΚΗ ΑΣΚΗΣΗ 2 ΛΥΣΕΙΣ Γραμμικές Δομές Δεδομένων, Ταξινόμηση

Ανάπτυξη εφαρμογών σε προγραμματιστικό περιβάλλον υποδειγματική διδασκαλία Κεφ. 3 Δομές Δεδομένων & αλγόριθμοι

Προγραμματισμός Η/Υ. 4 η ενότητα: Δομές Δεδομένων. Τμήμα. Τεχνολόγων Περιβάλλοντος. ΤΕΙ Ιονίων Νήσων. Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ιονίων Νήσων

Περιεχόµενα. 1 Εισαγωγή στις οµές εδοµένων 3. 2 Στοίβα (Stack) 5

Διορθώσεις σελ

Αλγόριθμοι και Δομές Δεδομένων (IΙ) (γράφοι και δένδρα)

Δομές Δεδομένων. Ενότητα 6: Εφαρμογή Συνδεδεμένων Λιστών: Αλφαβητικό ευρετήριο κειμένου- Υλοποίηση ΑΤΔ Στοίβα και Ουρά με δείκτες

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors, equals, tostring

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα

Τµήµα Πληροφορικής. Δοµές Δεδοµένων - Εργασία 1. Φθινοπωρινό Εξάµηνο Διδάσκων: E. Μαρκάκης. Στοίβες και Ουρές. Οικονοµικό Πανεπιστήµιο Αθηνών

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Δομές Δεδομένων. Ιωάννης Γ. Τόλλης Τμήμα Επιστήμης Υπολογιστών Πανεπιστήμιο Κρήτης

Διάλεξη 22: Δυαδικά Δέντρα. Διδάσκων: Παναγιώτης Ανδρέου

IsEmptyList(L): επιστρέφει true αν L = < >, false

ΕΝΟΤΗΤΑ 7 ΟΥΡΕΣ ΠΡΟΤΕΡΑΙΟΤΗΤΑΣ ΣΩΡΟΙ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΕΠΛ 035: οµές εδοµένων και Αλγόριθµοι για Ηλεκτρολόγους Μηχανικούς και Μηχανικούς Υπολογιστών

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα μέσα σε αντικείμενα Αντικείμενα ως επιστρεφόμενες τιμές Αντικείμενα με πίνακες

ΠΛΗ111. Ανοιξη Μάθηµα 4 ο. Στοίβα. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

Προγραμματισμός Η/Υ. Δομές Δεδομένων. ΤΕΙ Ιονίων Νήσων Τμήμα Τεχνολόγων Περιβάλλοντος Κατεύθυνση Τεχνολογιών Φυσικού Περιβάλλοντος

Δομές Δεδομένων & Αλγόριθμοι

Στοιχειώδεις Δομές Δεδομένων

Διδάσκων: Παναγιώτης Ανδρέου

ΚΕΦΑΛΑΙΟ 8: Αφαίρεση δεδοµένων

ιαφάνειες παρουσίασης #6 (α)

Transcript:

Διάλεξη 05: Αφηρημένοι Τύποι Δεδομένων Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Αφηρημένοι Τύποι Δεδομένων (ΑΤΔ) Οι ΑΤΔ Στοίβα και Ουρά Υλοποίηση των ΑΤΔ Στοίβα και Ουρά ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 1

Αφηρημένοι Τύποι Δεδομένων Τύπος Δεδομένων ένας τύπος μαζί με ένα σύνολο πράξεων για τη δημιουργία και επεξεργασία δεδομένων του τύπου (int, char, float) Αφηρημένος Τύπος Δεδομένων (ΑΤΔ) μαθηματικό μοντέλο που αποτελείται από ένα ή περισσότερα πεδία ορισμού και ένα σύνολο πράξεων για επεξεργασία των πεδίων ορισμού. Όταν μιλούμε για ένα ΑΤΔ μας ενδιαφέρει η προδιαγραφή του και πως θα τον χρησιμοποιήσουμε. Δεν μας ενδιαφέρει ο τρόπος υλοποίησής του μέσα στη μηχανή. (Η υλοποίηση ενός ΑΤΔ μπορεί να αλλάξει χωρίς να επηρεάσει την ορθότητα προγραμμάτων που τον χρησιμοποιούν.) ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 2

Αφηρημένοι Τύποι Δεδομένων (συν.) Παραδείγματα 1. Ο τύπος int μαζί με τις πράξεις +, *, /,, είναι ένας τύπος δεδομένων. Για να τον χρησιμοποιήσουμε πρέπει να γνωρίζουμε το σύνολο των πράξεων. Ο τρόπος αναπαράστασής του στον υπολογιστή δεν μας ενδιαφέρει 2. Ο τύπος double μαζί με τις πράξεις +, *, /,, είναι ένας τύπος δεδομένων. 3. Ο τύπος float μαζί με τις πράξεις +, *, /,, είναι ένας τύπος δεδομένων. ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 3

Αφηρημένοι Τύποι Δεδομένων (συν.) 4. Ο Αφηρημένος Τύπος Δεδομένων (ΑΤΔ) Ουρά Προτεραιότητας, το οποίο είναι ένα σύνολο στοιχείων τύπου key (π.χ., key=int ή key=char ή key (int,int) ), συνοδευόμενο από τις πιο κάτω πράξεις. δημιούργησε την άδεια ουρά προτεραιότητας, q, έλεγξε αν η ουρά q είναι άδεια, βάλε το στοιχείο k στην ουρά q, αφαίρεσε και επίστρεψε το μικρότερο στοιχείο της q (σύμφωνα με τη γραμμική διάταξη της ουράς). Ένας ΑΤΔ μπορεί να υλοποιηθεί με πολλούς τρόπους, π.χ. μια ουρά προτεραιότητας μπορεί να υλοποιηθεί από δομές λίστας, δενδρικές δομές κλπ. ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 4

Λίστες Λίστα μια ακολουθία στοιχείων (π.χ., Queue ή Stack όπως θα δούμε στην συνέχεια) Λ = α 1, α 2,..., α n Αναφερόμαστε στα στοιχεία της λίστας ως κόμβους. Με Λ[i] θα αναφερόμαστε στο i οστό στοιχείο της λίστας. Μήκος μιας λίστας Λ ονομάζεται ο αριθμός των στοιχείων της και συμβολίζεται ως Λ. Αν Λ = 0 τότε αναφερόμαστε στην κενή λίστα την οποία συμβολίζουμε ως. ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 5

Λίστες (συν.) Συνοδεύοντας λίστες με ένα σύνολο πράξεων μπορούμε να ορίσουμε αφηρημένους τύπους δεδομένων. Χρήσιμες πράξεις περιλαμβάνουν τις πιο κάτω Δημιουργία λίστας Εισαγωγή νέου κόμβου στη λίστα Εξαγωγή κόμβου από τη λίστα Εύρεση κόμβου με ορισμένη ιδιότητα Διάταξη της λίστας σύμφωνα με κάποια σχέση ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 6

Λίστες (συν.) Οι πιο σημαντικές πράξεις στον ορισμό ενός ΑΤΔ λίστας είναι η εισαγωγή και η εξαγωγή κόμβων στα άκρα της λίστας. Με βάση την προδιαγραφή αυτών των πράξεων, διακρίνουμε δύο βασικούς τύπους λίστας που έχουν πολλές και σημαντικές εφαρμογές σε κλάδους επιστημών που χρησιμοποιούν υπολογιστικές μεθόδους. Είναι οι ακόλουθες: Η στοίβα (stack) που έχει μόνο ένα άκρο προσιτό για εισαγωγές και εξαγωγές κόμβων. (LIFO Last In First Out) Η ουρά (queue) όπου γίνονται εισαγωγές στο ένα άκρο και εξαγωγές από το άλλο. (FIFO First In First Out) Υπάρχουν και άλλοι ΑΤΔ λίστας μικρότερης πρακτικής σημασίας, όπως: ουρά με δύο άκρα, πολλαπλή στοίβα, κλπ. ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 7

ΑΤΔ Στοίβα (stack) Ορίζουμε μια στοίβα S ως μια λίστα συνοδευόμενη από τις πιο κάτω πράξεις: makeempty() isempty(s) δημιούργησε την κενή στοίβα. επέστρεψε τη λογική τιμή που εκφράζει το αν η S είναι κενή. push(x) εισήγαγε τον κόμβο x στη στοίβα S. pop() διέγραψε τον κόμβο κορυφής της S. top() δώσε τον κόμβο κορυφής της S. size() επιστρέφει το πλήθος των στοιχείων της S. ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 8

ΑΤΔ Στοίβα (stack) (συν.) Οι πράξεις αυτές προδιαγράφονται από τους εξής κανόνες: isempty(makeempty) = true isempty(push(x)) = false pop(makeempty) = error πολιτική LIFO last in, first out pop(push(x)) = S top(makeempty()) = error top(push(x)) = x ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 9

Αναπαράσταση Αλγορίθμων Στοίβας Με χρήση μίας μεταβλητής top και μίας συλλογής από στοιχεία Στοίβα 0 1 2 5 top void makeempty(){ // Θέσε top = 1; // Άδειασε τα στοιχεία της στοίβας. -1 0 1 2 5 top public boolean isempty(){ // Aν το top = 1 επέστρεψε true αλλιώς false. public int size() { // Επέστρεψε το top+1. ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 10

Αναπαράσταση Αλγορίθμων Στοίβας (συν.) Με χρήση μίας μεταβλητής top και μίας συλλογής από στοιχεία Στοίβα 0 1 2 5 top public E top() { // Αν η στοίβα δεν είναι άδεια επέστρεψε το // στοιχειό στη θέση top, αλλιώς null. public void push(obj) { // Αύξησε τη θέση top κατά 1. // Πρόσθεσε το καινούριο στοιχείο στην θέση top. public void pop() { // Αν η στοίβα δεν είναι άδεια τότε διέγραψε // το στοιχειό στη θέση top. // Μείωσε τη θέση top κατά 1. 0 1 2 5 top 0 1 2 5 6 obj top 0 1 2 5 6 top ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 11

Παράδειγμα Χρήσης Στοίβας Ενέργεια Έξοδος S push(5) {5 push(3) {3, 5 pop() - (3) {5 push(7) {7, 5 pop() - (7) {5 top() 5 {5 pop() - (5) { top() null { isempty() true { push(9) {9 push(7) {7, 9 size() 2 {7, 9 push(3) {3, 7, 9 push(5) {5, 3, 7, 9 pop() - (9) {3, 7, 9 ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 3-12

ΑΤΔ Λίστα 2 : Ουρά (Queue) Νέες εισαγωγές γίνονται στο πίσω άκρο. Εξαγωγές από το μπροστινό άκρο Ορίζουμε μια ουρά Q ως μια λίστα συνοδευόμενη από τις πιο κάτω πράξεις: makeempty() δημιούργησε την κενή ουρά <>. isempty() επέστρεψε τη λογική τιμή που εκφράζει το αν η Q είναι κενή. enqueue (x) εισήγαγε τον κόμβο x στην ουρά Q. dequeue() διέγραψε τον κόμβο εξόδου της Q top(q) δώσε τον κόμβο εξόδου της Q. size() επιστρέφει το πλήθος των στοιχείων της Q. ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 13

ΑΤΔ Λίστα 2 : Ουρά (Queue) (συν.) Οι πράξεις αυτές προδιαγράφονται από τους εξής κανόνες isempty( makeempty( ) ) = true isempty( enqueue( x ) ) = false dequeue( makeempty( ) ) = error πολιτική FIFO first in, first out top (makeempty()) = error Προτού να εισάγουμε το x top( enqueue (x,q) ) = if isempty( Q ) then x else top( Q ) ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 14

Αναπαράσταση Ουράς Αναπαράσταση Ουράς με χρήση Πίνακα Για την αναπαράσταση μιας ουράς με στοιχεία α 0, α 1,..., α n 1 χρειαζόμαστε ένα πίνακα Α στον οποίο θα αποθηκεύσουμε τα στοιχεία της ουράς, Α[i 1] = α i, και δύο δείκτες που προσδιορίζουν τα δύο προσιτά άκρα της ουράς. Έτσι χρησιμοποιούμε μια εγγραφή με τρία πεδία 1. ένα πίνακα Α[n], 2. μια μεταβλητή front, τύπου ακέραιος, που συγκρατεί τη θέση εξόδου, και 3. μια μεταβλητή rear, τύπου ακέραιος, που συγκρατεί τη θέση εισόδου. Q 012 f r ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 15

Αναπαράσταση Αλγορίθμων Ουράς Με χρήση δύο μεταβλητών front,rear και μίας συλλογής από στοιχεία 0 1 2 5 Ουρά void makeempty(){ // Θέσε front=rear= 0; // Άδειασε τα στοιχεία της ουράς. front rear 0 1 2 5 front rear public boolean isempty(){ // Aν το front==rear επέστρεψε true // αλλιώς false. public int size() { // Επέστρεψε το (rear front + 1). 0 1 2 5 front rear 0 1 2 5 front rear rear front+1= 5 0+1= 6 ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 16

Αναπαράσταση Αλγορίθμων Ουράς (συν.) Ουρά 0 1 2 5 front rear public E top() { // Αν η ουρά δεν είναι άδεια επέστρεψε το // στοιχειό στη θέση front, αλλιώς null. public void enqueue(obj) { // Αύξησε τη θέση rear κατά 1. // Πρόσθεσε το καινούριο στοιχείο στην θέση rear. public void dequeue() { // Αν η ουρά δεν είναι άδεια τότε διέγραψε // το στοιχειό στη θέση front. // Αύξησε τη θέση front κατά 1. 0 1 2 5 front rear 0 1 2 5 6 obj front rear 0 1 2 5 6 front rear ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 17

Παράδειγμα Χρήσης Ουράς Ενέργεια Έξοδος Q enqueue(5) {5 enqueue(3) {5, 3 dequeue() - (5) {3 enqueue(7) {3, 7 dequeue() - (3) {7 top() 7 {7 dequeue() - (7) { dequeue() - (null) { isempty() true { enqueue(9) {9 enqueue(7) {9, 7 size() 2 {9, 7 enqueue(3) {9, 7, 3 enqueue(5) {9, 7, 3, 5 dequeue() - (9) {7, 3, 5 ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 3-18

Υλοποίηση ΑΤΔ Οι προαναφερθείς ΑΤΔ μπορούν να υλοποιηθούν με διάφορες δομές δεδομένων χρησιμοποιώντας είτε στατική είτε δυναμική χορήγηση μνήμης. Στατική: Δέσμευση μνήμης πριν την εκκίνηση προγράμματος π.χ., δημιουργία πίνακα με Ν θέσεις Δυναμική: Δέσμευση μνήμης κατά την διάρκεια της εκτέλεσης Χρησιμοποιώντας συλλογές (Collections) οι οποίες μεταβάλλουν δυναμικά το μέγεθός τους (π.χ., ArrayList, Vector) Χρησιμοποιώντας δείκτες αναφοράς (pointers) σε αντικείμενα ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 19

Στοίβα με Στατική Δέσμευση Μνήμης (πίνακας) Ο πιο απλός τρόπος είναι η χρήση μονοδιάστατου πίνακα. Χρειάζεται να γνωρίζουμε από την αρχή το μήκος της λίστας. Για την παράσταση στοίβας με στοιχεία α 1, α 2,..., α n χρειαζόμαστε ένα πίνακα Α στον οποίο θα αποθηκεύσουμε τα στοιχεία της στοίβας, Α[i 1] = α i. Πρέπει να γνωρίζουμε ανά πάσα στιγμή που βρίσκεται η κορυφή της στοίβας. Έτσι χρησιμοποιούμε μια εγγραφή με δύο πεδία 1. ένα πίνακα Α[0..n-1], και 2. μια μεταβλητή Length τύπου ακέραιος (που συγκρατεί τη θέση κορυφής). 0 1 2 3 4 5 6 7 8 9 Length Πρόβλημα: δεν μπορούμε να προσθέσουμε περισσότερα από n στοιχεία Δεν θα χρησιμοποιήσουμε αυτή την προσέγγιση ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 20

Διαπροσωπεία (Interface) Στοίβας public interface IStack<E> { public void makeempty(); public boolean isempty(); public int size(); public E top(); public void push(e obj); public void pop(); ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 21

Στοίβα με Δυναμική Δέσμευση Μνήμης (ArrayList) Με χρήση ArrayList και μίας μεταβλητής top import java.util.arraylist; public class Stack<E> implements IStack<E> { private ArrayList<E> stack; private int top; public Stack() { stack = new ArrayList<E>(); top = -1; public void makeempty(){ top=-1; stack.clear(); public boolean isempty(){ return (top == -1); public int size() { return top+1; public E top() { return isempty()? null : stack.get(top); public void push(e obj) { stack.add(obj); top++; public E pop() { if (!isempty()) { E temp = stack.get(top); stack.remove(top); top--; return temp; return null; // stack is empty π.χ., Stack<Integer> stack = new Stack<Integer>(); ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 22

Στοίβα με Δυναμική Δέσμευση Μνήμης 2 (ArrayList) Με χρήση μόνο ArrayList και της μεθόδου size() import java.util.arraylist; public class Stack<E> implements IStack<E> { private ArrayList<E> stack; public Stack() { stack = new ArrayList<E>(); public void makeempty(){ stack.clear(); public boolean isempty(){ return stack.size()==0; public int size() { return stack.size(); public E top() { return isempty()? null : stack.get(stack.size()-1); public void push(e obj) { stack.add(obj); public E pop() { if (!isempty()) { E temp = stack.get(stack.size()-1); stack.remove(stack.size()-1); return temp; return null; // stack is empty ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 23

Διαπροσωπεία (Interface) Ουράς public interface IQueue<E> { public void makeempty(); public boolean isempty(); public int size(); public E top(); public void enqueue(e obj); public void dequeue(); ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 24

Ουρά με Δυναμική Δέσμευση Μνήμης (ArrayList) Με χρήση μόνο ArrayList και της μεθόδου size() import java.util.arraylist; public class Queue<E> implements IQueue<E> { private ArrayList<E> queue; public Queue(){ queue = new ArrayList<E>(); public void makeempty() { queue.clear(); public boolean isempty() { return queue.size()==0; public int size() { return queue.size(); public E top() { if(!isempty()) { return queue.get(0); return null; public void enqueue(e obj) { queue.add(obj); public void dequeue() { if(!isempty()) { queue.remove(0); ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 25

ΑΤΔ Λίστα 3: Κυκλική Ουρά Για λόγους χώρου μνήμης μπορούμε να πραγματοποιήσουμε την ουρά με μια κυκλική διάταξη των λέξεων της μνήμης. Δηλαδή θα θεωρούμε ότι η περιοχή μνήμης δεν αρχίζει με τη λέξη Α[0] και τελειώνει με τη λέξη Α[n 1], αλλά ότι μετά την Α[n 1] ακολουθεί η Α[0]. A[n-2] A[n-1] A[0] A[1]... Έτσι μετά από μια ακολουθία εισαγωγών και εξαγωγών η ουρά μας πιθανόν να έχει την πιο κάτω μορφή όπου θεωρούμε ότι η αρχή της ουράς βρίσκεται στη θέση k και το τέλος της ουράς στη θέση 4. k ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 26

ΑΤΔ Λίστα 4: Ουρές με Δύο Άκρα Ο ΑΤΔ ουρά με δύο άκρα είναι παρόμοιος με το ΑΤΔ ουρά, με τη διαφορά ότι έχει δύο άκρα και επιτρέπει εισαγωγές και εξαγωγές και στα δύο. Μια ουρά δύο άκρων ορίζεται ως μια λίστα συνοδευόμενη από τις πιο κάτω πράξεις: makeempty(), isempty() insert(x) εισήγαγε το στοιχείο x στο μπροστινό άκρο της Q eject() διέγραψε τον κόμβο στο πίσω άκρο της Q enqueue (x) εισήγαγε τον στοιχείο x στο πίσω μέρος της Q. dequeue() διέγραψε τον κόμβο στο μπροστινό άκρο της Q front(q) δώσε τον κόμβο στο μπροστινό άκρο της Q rear(q) δώσε τον κόμβο στο πίσω άκρο της Q ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 27

Ουρές με Δύο Άκρα με Στατική Δέσμευση Μνήμης Για την παράσταση μιας ουράς με στοιχεία α 0, α 1,..., α n 1 χρειαζόμαστε ένα πίνακα Α στον οποίο θα αποθηκεύσουμε τα στοιχεία της ουράς, Θα αναφερόμαστε στο στοιχείο Α[i 1] σαν α i, δύο δείκτες που προσδιορίζουν τα δύο προσιτά άκρα της ουράς. Έτσι χρησιμοποιούμε μια εγγραφή με τρία πεδία 1. ένα πίνακα Α[n], 2. μια μεταβλητή front, τύπου ακέραιος, που συγκρατεί τη θέση που βρίσκεται αμέσως πριν τη θέση εξόδου, και 3. μια μεταβλητή rear, τύπου ακέραιος, που συγκρατεί τη θέση του τελευταίου στοιχείου της ουράς. Μέγεθος ουράς: rear front+1 (πχ rear=2, front=0 => length=3) ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 28