Δομές Δεδομένων. Ενότητα 5: Στοίβες. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Σχετικά έγγραφα
Δομές Δεδομένων. Ενότητα 2: Περισσότερα για τους δείκτες. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Δομές Δεδομένων. Ενότητα 3: Διαχείριση μνήμης. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Δομές Δεδομένων. Ενότητα 6: Ουρές. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Δομές Δεδομένων. Ενότητα 4: Πίνακες. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Δομές Δεδομένων. Ενότητα 1: Βασικοί τύποι δεδομένων. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Δομές Δεδομένων. Ενότητα 8: Διπλά συνδεδεμένες λίστες. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Προγραμματισμός H/Y Ενότητα 4: Δείκτες. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

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

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Λογιστική Κόστους Ενότητα 12: Λογισμός Κόστους (2)

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Εισαγωγή στον δομημένο προγραμματισμό

Εισαγωγή στους Αλγορίθμους

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Λογιστική Κόστους Ενότητα 8: Κοστολογική διάρθρωση Κύρια / Βοηθητικά Κέντρα Κόστους.

Διοίκηση Εξωτερικής Εμπορικής Δραστηριότητας

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Εισαγωγή στους Αλγορίθμους

Προγραμματισμός H/Y Ενότητα 5: Συναρτήσεις. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

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

Αντικειμενοστραφής Προγραμματισμός

Προγραμματισμός H/Y Ενότητα 2: Εντολές ελέγχου ροής. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Εισαγωγή στους Αλγορίθμους

Προγραμματισμός H/Y Ενότητα 6: Δομές (structures) Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Προγραμματισμός H/Y Ενότητα 1: Εισαγωγή. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Εισαγωγή στους Αλγορίθμους Ενότητα 10η

Βάσεις Δεδομένων. Ενότητα 1: Εισαγωγή στις Βάσεις δεδομένων. Πασχαλίδης Δημοσθένης Τμήμα Ιερατικών σπουδών

Προγραμματισμός H/Y Ενότητα 3: Πίνακες αριθμών και χαρακτήρων. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ. Ενότητα: ΔΟΜΕΣ ΕΠΑΝΑΛΗΨΗΣ ΚΥΡΟΠΟΥΛΟΣ ΚΩΝΣΤΑΝΤΙΝΟΣ. Τμήμα Διοίκηση Επιχειρήσεων (Κοζάνη)

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

Αντικειμενοστρεφής Προγραμματισμός Ενότητα 3: Constructors και destructors

Προγραμματισμός H/Y Ενότητα 7: Αρχεία. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Θερμοδυναμική. Ανοικτά Ακαδημαϊκά Μαθήματα. Πίνακες Νερού σε κατάσταση Κορεσμού. Γεώργιος Κ. Χατζηκωνσταντής Επίκουρος Καθηγητής

Αντικειμενοστραφής Προγραμματισμός

Διοικητική Λογιστική

Ηλεκτρονικοί Υπολογιστές

Μεθοδολογία Έρευνας Κοινωνικών Επιστημών Ενότητα 2: ΣΥΓΚΕΝΤΡΩΣΗ ΠΛΗΡΟΦΟΡΙΩΝ ΜΑΡΚΕΤΙΝΓΚ Λοίζου Ευστράτιος Τμήμα Τεχνολόγων Γεωπόνων-Kατεύθυνση

Λογιστική Κόστους Ενότητα 11: Λογισμός Κόστους (1)

Εισαγωγή στους Αλγορίθμους Ενότητα 7η

Εισαγωγή στους Αλγορίθμους Ενότητα 8η

Συστήματα Αναμονής. Ενότητα 3: Στοχαστικές Ανελίξεις. Αγγελική Σγώρα Τμήμα Μηχανικών Πληροφορικής ΤΕ

Διοίκηση Εξωτερικής Εμπορικής Δραστηριότητας

Αντικειμενοστρεφής Προγραμματισμός Ενότητα 5: Κληρονομικότητα. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Αντικειμενοστρεφής Προγραμματισμός Ενότητα 9: Ειδικά θέματα γλώσσας C/C++. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Εισαγωγή στους Αλγορίθμους Ενότητα 10η Άσκηση Αλγόριθμος Dijkstra

Μηχανολογικό Σχέδιο Ι

ΑΝΤΙΡΡΥΠΑΝΤΙΚΗ ΤΕΧΝΟΛΟΓΙΑ ΑΙΩΡΟΥΜΕΝΩΝ ΣΩΜΑΤΙΔΙΩΝ Ενότητα 2: Αιωρούμενα σωματίδια & Απόδοση συλλογής Αν. Καθ. Δρ Μαρία Α. Γούλα Τμήμα Μηχανικών

Αντικειμενοστρεφής Προγραμματισμός Ενότητα 1: Εισαγωγή. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Αντικειμενοστραφής Προγραμματισμός

ΣΥΣΤΗΜΑΤΑ ΗΛΕΚΤΡΙΚΗΣ ΕΝΕΡΓΕΙΑΣ ΙIΙ

ΣΥΣΤΗΜΑΤΑ ΗΛΕΚΤΡΙΚΗΣ ΕΝΕΡΓΕΙΑΣ ΙIΙ

ΣΥΣΤΗΜΑΤΑ ΗΛΕΚΤΡΙΚΗΣ ΕΝΕΡΓΕΙΑΣ ΙIΙ

Ενότητα. Εισαγωγή στις βάσεις δεδομένων

Οργάνωση και Διοίκηση Πωλήσεων

Αντικειμενοστρεφής Προγραμματισμός Ενότητα 7: Υπερφόρτωση τελεστών. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Λογιστική Κόστους Ενότητα 11: Λογισμός Κόστους

ΗΛΕΚΤΡΟΤΕΧΝΙΑ-ΗΛΕΚΤΡΟΝΙΚΗ ΕΡΓΑΣΤΗΡΙΟ

Εισαγωγή στους Αλγορίθμους Ενότητα 9η Άσκηση - Αλγόριθμος Prim

Εισαγωγή στους Αλγορίθμους Ενότητα 9η Άσκηση - Αλγόριθμος Kruskal

Σχεδίαση και Ανάλυση Αλγορίθμων Ενότητα 4: ΑΝΑΠΑΡΑΣΤΑΣΗ ΔΕΔΟΜΕΝΩΝ - ΔΕΝΤΡΑ

Αντικειμενοστραφής Προγραμματισμός

Δομημένος Προγραμματισμός

Προγραμματισμός Ηλεκτρονικών Υπολογιστών 2 - Εργαστήριο

Λογιστική Κόστους Ενότητα 10: Ασκήσεις Προτύπου Κόστους Αποκλίσεων.

Πληροφορική ΙΙ Θεματική Ενότητα 5

Αντικειμενοστραφής Προγραμματισμός

Οργάνωση και Διοίκηση Πωλήσεων Ενότητα 1: Ο ΡΟΛΟΣ ΤΩΝ ΠΩΛΗΣΕΩΝ ΣΤΟ ΠΛΑΙΣΙΟ ΤΗΣ ΣΤΡΑΤΗΓΙΚΗΣ ΜΑΡΚΕΤΙΝΓΚ

Σχεδίαση Δικτύων Υπολογιστών

Εισαγωγή στους Αλγορίθμους Ενότητα 9η

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

Συστήματα Αναμονής. Ενότητα 7: Ουρά Μ/Μ/1. Αγγελική Σγώρα Τμήμα Μηχανικών Πληροφορικής ΤΕ

Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας. Βιοστατιστική (Ε) Ενότητα 3: Έλεγχοι στατιστικών υποθέσεων

Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας. Βιοστατιστική (Ε) Ενότητα 1: Καταχώρηση δεδομένων

ΗΛΕΚΤΡΟΤΕΧΝΙΑ-ΗΛΕΚΤΡΟΝΙΚΗ ΕΡΓΑΣΤΗΡΙΟ

Αντικειμενοστρεφής Προγραμματισμός Ενότητα 6: Φιλικές συναρτήσεις. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

ΗΛΕΚΤΡΟΤΕΧΝΙΑ-ΗΛΕΚΤΡΟΝΙΚΗ ΕΡΓΑΣΤΗΡΙΟ

Συστήματα Αναμονής. Ενότητα 5: Ανέλιξη Poisson. Αγγελική Σγώρα Τμήμα Μηχανικών Πληροφορικής ΤΕ

ΟΙΚΟΝΟΜΕΤΡΙΑ. Ενότητα 3: Πολλαπλή Παλινδρόμηση. Αναπλ. Καθηγητής Νικόλαος Σαριαννίδης Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

ΟΙΚΟΝΟΜΕΤΡΙΑ. Ενότητα 1: Εκτιμητές και Ιδιότητες. Αναπλ. Καθηγητής Νικόλαος Σαριαννίδης Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Εισαγωγή στον δομημένο προγραμματισμό

Τεχνικό Σχέδιο - CAD

Συστήματα Αναμονής. Ενότητα 4: Αλυσίδες Markov. Αγγελική Σγώρα Τμήμα Μηχανικών Πληροφορικής ΤΕ

Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας. Βιοστατιστική (Ε) Ενότητα 2: Περιγραφική στατιστική

Αντικειμενοστρεφής Προγραμματισμός Ενότητα 2: Κλάσεις. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Εισαγωγή στους Αλγορίθμους Φροντιστήριο 4

Εισαγωγή στους Υπολογιστές

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

Τεχνολογία Πολυμέσων. Ενότητα 8: Pool Table. Νικολάου Σπύρος Τμήμα Μηχανικών Πληροφορικής ΤΕ

Δομές Δεδομένων. Ενότητα 9: Αναδρομικότητα. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Μεθοδολογία Έρευνας Κοινωνικών Επιστημών Ενότητα 4: Πηγές Δεδομένων- Δευτερογενή Στοιχεία. Λοίζου Ευστράτιος Τμήμα Τεχνολόγων Γεωπόνων-Kατεύθυνση

Διδακτική της Πληροφορικής

Διεθνείς Οικονομικές Σχέσεις και Ανάπτυξη

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

Προγραμματισμός ΙΙ. Ενότητα 4: Διαχείριση μνήμης. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Προγραμματισμός ΙΙ. Ενότητα 2: Διαχείριση μνήμης. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

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

Transcript:

Δομές Δεδομένων Ενότητα 5: Στοίβες Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς. 2

Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο TEI Δυτικής Μακεδονίας και στην Ανώτατη Εκκλησιαστική Ακαδημία Θεσσαλονίκης» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους. 3

Σκοποί ενότητας Σε αυτή την ενότητα παρουσιάζονται οι στοίβες. 4

Περιεχόμενα ενότητας Στατικές στοίβες. Παράδειγμα στατικής στοίβας. Δηλώσεις και υλοποιήσεις πέντε βασικών λειτουργιών για τη στατική στοίβα. Ασκήσεις στις στατικές στοίβες. Δυναμικές στοίβες. Παράδειγμα δυναμικής στοίβας. Ερωτήσεις. Ασκήσεις στις δυναμικές στοίβες. Βιβλιογραφία. 5

Εισαγωγή Οι στοίβες είναι μια δομή στην οποία οι βασικές λειτουργίες εισαγωγής και εξαγωγής στοιχείων γίνονται στο ίδιο άκρο τους (στην κορυφή). Η κλασσική απεικόνισή τους είναι με τη βοήθεια μιας στοίβας πιάτων στην οποία προσθέτουμε και αφαιρούμε στοιχεία στην κορυφή της. Η υλοποίηση των στοιβών γίνεται συνήθως με στατικό τρόπο (μονοδιάστατους πίνακες) και δυναμικό τρόπο (συνδεδεμένες λίστες). 6

Στατικές στοίβες (1/4) Στο σχήμα απεικονίζεται μια στατική στοίβα που είναι υλοποιημένη με τη βοήθεια ενός μονοδιάστατου πίνακα 10 στοιχείων, τα οποία είναι αριθμημένα από 0 μέχρι 9. Εικόνα 1. Στατική στοίβα. Πηγή: Διδάσκων (2015). 7

Στατικές στοίβες (2/4) Ο δείκτης i εξυπηρετεί δύο σκοπούς: 1. Μας δίνει το πλήθος των στοιχείων που είναι αποθηκευμένα στη στοίβα (εδώ έχουμε δύο στοιχεία στις θέσεις 0 και 1). 2. Δείχνει στην επόμενη διαθέσιμη θέση στην οποία μπορεί να προστεθεί ένα στοιχείο (η επόμενη διαθέσιμη θέση για ώθηση ενός στοιχείου στη στοίβα είναι η 2, δηλ. η 3η κατά σειρά θέση). 8

Στατικές στοίβες (3/4) Οι βασικές λειτουργίες μιας στοίβας (είτε στατικής είτε δυναμικής) είναι οι ακόλουθες: 1. Αρχικοποίηση (δηλωμένης) στοίβας. 2. Έλεγχος για κενή στοίβα. 3. Ώθηση/εισαγωγή στοιχείου στην κορυφή μιας στοίβας που δεν έχει γεμίσει. 4. Ανάγνωση με αφαίρεση/εξαγωγή του στοιχείου στην κορυφή μιας στοίβας που έχει τουλάχιστον 1 στοιχείο. 5. Ανάγνωση χωρίς αφαίρεση/εξαγωγή του στοιχείου στην κορυφή μιας στοίβας που έχει τουλάχιστον 1 στοιχείο. 6. Αποδέσμευση μιας δυναμικής στοίβας. 9

Στατικές στοίβες (4/4) Φυσικά μπορείτε να επινοήσετε και άλλες βοηθητικές λειτουργίες, όπως η επί τόπου αντιστροφή μιας στοίβας, η αντιστροφή της σε 2η, η εμφάνιση των στοιχείων της στην οθόνη (για έλεγχο του προγράμματός σας), ενδεχομένως το μέτρημα των στοιχείων της (αν δε διατηρείτε μετρητή κατά την εισαγωγή και εξαγωγή στοιχείων στοιχείων), κ.α. Ακολουθεί ένα απλό πρόγραμμα που δείχνει μια βασική υλοποίηση στατικής στοίβας. Παρακάτω θα σχολιάσουμε τον κώδικα. 10

Παράδειγμα στατικής στοίβας (1/9) /* -------------------------------------------------------------------------- */ #include <stdio.h> #include <stdlib.h> /* -------------------------------------------------------------------------- */ #define MAX_STACK_SIZE 10 /* -------------------------------------------------------------------------- */ typedef int TItem; 11

Παράδειγμα στατικής στοίβας (2/9) typedef struct { Titem size_t } TStaticStack; Array[MAX_STACK_SIZE]; Index; void StaticStack_Init(TStaticStack *s) { for ( size_t i = 0; i < MAX_STACK_SIZE; i++ ) s->array[i] = 0; s->index = 0; } // StaticStack_Init 12

Παράδειγμα στατικής στοίβας (3/9) bool StaticStack_IsEmpty(TStaticStack s) { return ( s.index == 0 ); } // StaticStack_IsEmpty bool StaticStack_Push(TStaticStack *s, TItem Item) { if ( s->index < MAX_STACK_SIZE ) { s->array[s->index] = Item; s->index++; return ( true ); } else { return ( false ); } // if } // StaticStack_Push 13

Παράδειγμα στατικής στοίβας (4/9) bool StaticStack_Pop(TStaticStack *s, TItem *Item) { if ( s->index > 0 ) { s->index--; *Item = s->array[s->index]; return ( true ); } else { return ( false ); } // if } // StaticStack_Pop 14

Παράδειγμα στατικής στοίβας (5/9) bool StaticStack_Top(TStaticStack s, TItem *Item) { if ( s.index > 0 ) { *Item = s.array[s.index - 1]; return ( true ); } else { return ( false ); } // if } // StaticStack_Top 15

Παράδειγμα στατικής στοίβας (6/9) /* -------------------------------------------------------------------------- */ void main() { TStaticStack stack; TItem item; printf("\nstaticstack_init\n"); printf("---------------------------\n"); StaticStack_Init(&stack); 16

Παράδειγμα στατικής στοίβας printf("\nstaticstack_push\n"); printf("---------------------------\n"); (7/9) while ( StaticStack_Push(&stack, rand()) ) printf("push: [%d] = %5d\n", stack.index - 1, stack.array[stack.index - 1]); printf("\nstaticstack_pop\n"); printf("---------------------------\n"); while ( StaticStack_Pop(&stack, &item) ) } // main printf("pop: [%d] = %5d\n", stack.index, stack.array[stack.index]); /* -------------------------------------------------------------------------- */ 17

Παράδειγμα στατικής στοίβας (8/9) Η βασική δήλωση των τύπων δίνεται στην αρχή του προγράμματος. Πιο συγκεκριμένα: typedef int TItem; typedef struct { Titem Array[MAX_STACK_SIZE]; size_t Index; } TStaticStack; 18

Παράδειγμα στατικής στοίβας (9/9) Ο τύπος TItem εδώ είναι ένας απλός ακέραιος. Στην πράξη μπορεί να είναι κάτι πολύ πιο πολύπλοκο. Η χρήση ενός τέτοιου ενδιάμεσου τύπου μάς βοηθάει να μειώσουμε το πλήθος των αλλαγών σε περίπτωση που αποφασίσουμε να χρησιμοποιήσουμε άλλον τύπο δεδομένων στη στοίβα. Ακολουθεί η δήλωση της στατικής στοίβας (TStaticStack), η οποία περιγράφεται με μια δομή που περιέχει έναν πίνακα στοιχείων τύπου TItem με MAX_STACK_SIZE θέσεις (εδώ απλά 10), και ένα δείκτη/μετρητή, όπως περιγράψαμε πιο πάνω. 19

Δηλώσεις και υλοποιήσεις πέντε βασικών λειτουργιών για τη στατική στοίβα (1/5) 1. Η συνάρτηση void StaticStack_Init(TStaticStack *s) δέχεται μία παράμετρο δείκτη/διεύθυνση στοίβας και αρχικοποιεί τα στοιχεία του πίνακα στο 0 και το δείκτη, επίσης, στο 0. Έτσι γνωρίζουμε ότι μόλις ξεκινήσουμε έχουμε 0 στοιχεία στη στοίβα (είναι κενή). Αυτή η συνάρτηση μεταβάλλει τη στοίβα. 20

Δηλώσεις και υλοποιήσεις πέντε βασικών λειτουργιών για τη στατική στοίβα (2/5) 2. Η συνάρτηση bool StaticStack_IsEmpty(TStaticStack s) δέχεται μία παράμετρο που είναι στοίβα και επιστρέφει TRUE αν η στοίβα είναι κενή (δηλαδή το δείκτης της είναι 0), αλλιώς επιστρέφει FALSE. Αυτή η συνάρτηση δε μεταβάλλει τη στοίβα. 21

Δηλώσεις και υλοποιήσεις πέντε βασικών λειτουργιών για τη στατική στοίβα (3/5) 3. Η συνάρτηση bool StaticStack_Push(TStaticStack *s, TItem Item) δέχεται δύο παραμέτρους: Μία στοίβα στην οποία θα γίνει απόπειρα ώθησης/εισαγωγής ενός στοιχείου, και το στοιχείο στη 2η παράμετρο. Αν η ώθηση ήταν επιτυχής, δηλαδή υπήρχε χώρος για την προσθήκη του στοιχείου στη στοίβα, επιστρέφει TRUE, αλλιώς επιστρέφει FALSE. Αυτή η συνάρτηση δυνητικά μεταβάλλει τη στοίβα αν υπάρχει χώρος για την εισαγωγή ενός στοιχείου σε αυτή (τον πίνακα με τα στοιχεία και το δείκτη/μετρητή), αλλιώς την αφήνει άθικτη. Σε κάθε περίπτωση αφήνει το στοιχείο αμετάβλητο. 22

Δηλώσεις και υλοποιήσεις πέντε βασικών λειτουργιών για τη στατική στοίβα (4/5) 4. Η συνάρτηση bool StaticStack_Pop(TStaticStack *s, TItem *Item) δέχεται δύο παραμέτρους: Μία στοίβα στην οποία θα γίνει απόπειρα εξαγωγής στοιχείου, και μια διεύθυνση στοιχείου στην οποία θα μπει το στοιχείο που ενδεχομένως εξαχθεί. Αν η εξαγωγή ήταν επιτυχής, δηλαδή υπήρχε στοιχείο στη στοίβα για αφαίρεση, επιστρέφει TRUE, αλλιώς επιστρέφει FALSE. Αυτή η συνάρτηση δυνητικά μεταβάλλει τη στοίβα (τόσο τον πίνακα όσο και το δείκτη/μετρητή) και το στοιχείο αν υπάρχουν στοιχεία σε αυτή, αλλιώς δε μεταβάλλει καμία παράμετρο. 23

Δηλώσεις και υλοποιήσεις πέντε βασικών λειτουργιών για τη στατική στοίβα (5/5) 5. Η συνάρτηση bool StaticStack_Top(TStaticStack s, TItem *Item) δέχεται δύο παραμέτρους: Μία στοίβα στην οποία θα γίνει απόπειρα ανάγνωσης του στοιχείου στην κορυφή της, και τη διεύθυνση ενός στοιχείου στην οποία θα αποθηκευτεί η τιμή του στοιχείου στη κορυφή της στοίβας, αν αυτή δεν είναι άδεια. Αν υπάρχει στοιχείο προς ανάγνωση (η στοίβα έχει στοιχεία) τότε επιστρέφει TRUE, αλλιώς επιστρέφει FALSE. Αυτή η συνάρτηση δε μεταβάλλει τη στοίβα, αλλά δυνητικά μεταβάλλει τη 2η παράμετρο. 24

Ασκήσεις στις στατικές στοίβες Άσκηση 1. Υλοποιήστε συνάρτηση που αντιστρέφει τη σειρά των στοιχείων μιας στοίβας, αφήνοντας το δείκτη στην κορυφής της αμετάβλητο. Άσκηση 2. Υλοποιήστε συνάρτηση που αντιγράφει τα στοιχεία μιας στοίβας σε μια άλλη, αλλά με αντίστροφη σειρά. 25

Δυναμικές στοίβες (1/16) Στο σχήμα απεικονίζεται μια δυναμική στοίβα η οποία είναι υλοποιημένη αλυσιδωτά με μικρά μπλοκ μνήμης που περιέχουν τα δεδομένα (TItem) και δείκτη σε επόμενο μπλοκ. Εικόνα 2. Δυναμική στοίβα. Πηγή: Διδάσκων (2015). 26

Δυναμικές στοίβες (2/16) Κάθε μπλοκ δύο στοιχείων (Item, Next) είναι τύπου: typedef struct TDynamicStackTAG { TItem Item; TDynamicStackTAG *Next; } TDynamicStack; 27

Δυναμικές στοίβες (3/16) Ο δείκτης Head δείχνει στο πρώτο στοιχείο της στοίβας (στην κορυφή της). Η εισαγωγή ενός στοιχείου (π.χ. του 50) θα γινόταν αμέσως μετά το Head, δηλαδή ανάμεσα στο Head και στη δυάδα που περιέχει το 40. Ομοίως, η αφαίρεση ενός στοιχείου από τη στοίβα θα σημάνει την αφαίρεση του 40 από αυτή, και τη σύνδεση του Head με το 30. 28

Δυναμικές στοίβες (4/16) Είναι σημαντικό να μη χάσουμε ή καταστρέψουμε την αλυσίδα με το λάθος χειρισμό των δεικτών, αφού έτσι θα χάσουμε την πρόσβαση στα στοιχεία μιας στοίβας, αλλά δε θα μπορούμε και να αποδεσμεύσουμε τη μνήμη που έχουμε δεσμεύσει για κάθε ένα στοιχείο της στοίβας. 29

Δυναμικές στοίβες (5/16) Η σειρά των ενεργειών για την εισαγωγή ενός στοιχείου στην κορυφή της στοίβας είναι η εξής: 1. Δέσμευση μνήμης για ένα στοιχείο. 2. Αν η δέσμευση πετύχει, τότε: a. Αντιγράφουμε τα δεδομένα που θέλουμε στο Item του καινούργιου στοιχείου (δηλ. το ζεύγος Item, Next). b. Αντιγράφουμε το δείκτη της κεφαλής της στοίβας στο Next του καινούργιου στοιχείου, ώστε να μη χάσουμε την αλυσίδα προς τα υπόλοιπα στοιχεία. c. Ενημερώνουμε το δείκτη της κεφαλής της στοίβας ώστε να δείχνει στη διεύθυνση μνήμης του καινούργιου στοιχείου που μόλις πριν λίγο δεσμεύσαμε. d. Αναφέρουμε την επιτυχή ώθηση ενός στοιχείου στη στοίβα. 30

Δυναμικές στοίβες (6/16) 3. Αν η δέσμευση ΔΕΝ πετύχει, τότε: a. Αφήνουμε τη στοίβα αμετάβλητη, δηλαδή δεν επιτελούμε καμία ενέργεια (όπως θα δείτε στην υλοποίηση σε λίγο αυτό είναι εύκολο, αφού δε γράφουμε καθόλου κώδικα). b. Αναφέρουμε την αποτυχία ώθησης ενός στοιχείου στη στοίβα. 31

Δυναμικές στοίβες (7/16) Δηλαδή, όπως παρατηρούμε, η επιτυχής ή ανεπιτυχής εισαγωγή ενός στοιχείου στη στοίβα εξαρτάται από την ύπαρξη μνήμης (ή απλούστερα χώρου) για τα νέα δεδομένα. Θα παρατηρήσετε ότι αυτό είναι αντίστοιχο της ύπαρξης χώρου στον πίνακα στην περίπτωση της στατικής στοίβας. 32

Δυναμικές στοίβες (8/16) Η σειρά των ενεργειών για την ανάγνωση και εξαγωγή ενός στοιχείου από την κορυφή μιας στοίβας είναι η εξής: 1. Έλεγχος αν η στοίβα είναι κενή (ο δείκτης της κεφαλής της στοίβας είναι NULL). a. Δε μεταβάλλουμε καμία παράμετρο (τη στοίβα και το χώρο αποθήκευσης της τιμής στην κορυφή της στοίβας). b. Αναφέρουμε την αποτυχία ανάγνωσης και εξαγωγής του επάνω στοιχείου από τη στοίβα. 33

Δυναμικές στοίβες (9/16) 2. Αν η στοίβα ΔΕΝ είναι κενή, τότε: a. Δηλώνουμε προσωρινό δείκτη στον τύπο της δομής, και αντιγράφουμε σε αυτόν τα περιεχόμενα της κεφαλής της στοίβας. b. Τροποποιούμε την κεφαλή ώστε να δείχνει στο επόμενο στοιχείο της στοίβας από αυτό που έδειχνε. c. Ενημερώνουμε την παράμετρο με τα δεδομένα του στοιχείου που θα αφαιρέσουμε. d. Ελευθερώνουμε το χώρο μνήμης που δεσμεύτηκε για το προς αφαίρεση στοιχείο. e. Αναφέρουμε την επιτυχή εξαγωγή του επάνω στοιχείου της στοίβας. 34

Δυναμικές στοίβες (10/16) Θα παρατηρήσετε για μία ακόμη φορά ότι η επιτυχία της συγκεκριμένης λειτουργίας εξαρτάται αποκλειστικά από την ύπαρξη στοιχείων στη στοίβα, δηλαδή όπως ακριβώς και με την περίπτωση της στατικά υλοποιημένης στοίβας. 35

Δυναμικές στοίβες (11/16) Η σειρά των ενεργειών για την απλή ανάγνωση του στοιχείου στην κορυφή μιας στοίβας, χωρίς την αφαίρεσή του, είναι η εξής: 1. Έλεγχος αν η στοίβα είναι κενή (ο δείκτης της κεφαλής της στοίβας είναι NULL). a. Δε μεταβάλλουμε καμία παράμετρο. Φυσικά η στοίβα στην παρούσα λειτουργία δε θα άλλαζε, ούτως ή άλλως. b. Αναφέρουμε την αποτυχία ανάγνωσης του επάνω στοιχείου από τη στοίβα. 36

Δυναμικές στοίβες (12/16) 2. Αν η στοίβα ΔΕΝ είναι κενή, τότε: a. Αντιγράφουμε τα δεδομένα (Item) του πρώτου/επάνω στοιχείου της στοίβας στην παράμετρο. b. Αναφέρουμε την επιτυχή ανάγνωση του επάνω στοιχείου της στοίβας. 37

Δυναμικές στοίβες (13/16) Το μέτρημα των στοιχείων μιας δυναμικής στοίβας γίνεται με τη χρήση ενός προσωρινού δείκτη που, για αρχή, δείχνει στην κορυφή της στοίβας. Με τη βοήθεια αυτού του δείκτη «κατεβαίνουμε» τη στοίβα μέχρι αυτός να γίνει NULL, μετρώντας ταυτόχρονα τα στοιχεία της στοίβας ένα-ένα. 38

Δυναμικές στοίβες (14/16) Η χρήση του προσωρινού δείκτη είναι απαραίτητη, αφού αν τροποποιήσουμε το δείκτη της κεφαλής της στοίβας, στο τέλος θα χάσουμε ολόκληρη τη στοίβα. Εξάλλου, η λειτουργία του μετρήματος των στοιχείων μιας στοίβας δε θα πρέπει να τη μεταβάλλει καθόλου, αλλά απλά να μετρήσει τα στοιχεία της. 39

Δυναμικές στοίβες (15/16) Η αποδέσμευση των στοιχείων μιας στοίβας είναι απαραίτητη ώστε να επιστρέψουμε πίσω στο ΛΣ τη μνήμη που έχουμε δεσμεύσει. Ο τρόπος υλοποίησης είναι παρόμοιος με το μέτρημα, δηλαδή με τη χρήση ενός προσωρινού δείκτη ο οποίος προοδευτικά δείχνει ολοένα και πιο κάτω στη στοίβα, αποδεσμεύοντας τη μνήμη καθ' οδόν. 40

Δυναμικές στοίβες (16/16) Τα πλεονεκτήματα και μειονεκτήματα, όσον αφορά τη στατική ή δυναμική υλοποίηση μιας στοίβας, συνοψίζονται ως εξής: Η στατική στοίβα είναι απλούστερη στην υλοποίηση. Η στατική στοίβα δέχεται σταθερό μέγιστο αριθμό στοιχείων, είτε χρησιμοποιείται ολόκληρη η μνήμη, είτε όχι. Η δυναμική στοίβα χρησιμοποιεί μνήμη ανάλογη των στοιχείων που έχει αποθηκευμένα. Ο χώρος που απαιτείται για την αποθήκευση των δεδομένων σε κάθε κόμβο μιας δυναμικής στοίβας είναι μεγαλύτερος σε σχέση με τη στατική, αφού σε κάθε κόμβο αποθηκεύονται όχι μόνο τα δεδομένα που θέλουμε, αλλά και ένας δείκτης προς το επόμενο στοιχείο. Ακολουθεί μία ενδεικτική υλοποίηση δυναμικής στοίβας. 41

Παράδειγμα δυναμικής στοίβας (1/18) /* -------------------------------------------------------------------------- */ #include <stdio.h> #include <stdlib.h> /* -------------------------------------------------------------------------- */ typedef int TItem; typedef struct TDynamicStackTAG { TItem TDynamicStackTAG *Next; } TDynamicStack; Item; 42

Παράδειγμα δυναμικής στοίβας (2/18) void DynamicStack_Init(TDynamicStack **s) { *s = NULL; } // DynamicStack_Init bool DynamicStack_IsEmpty(TDynamicStack *s) { return ( s == NULL ); } // DynamicStack_IsEmpty 43

Παράδειγμα δυναμικής στοίβας (3/18) bool DynamicStack_Push(TDynamicStack **s, TItem Item) { TDynamicStack *NewItem; NewItem = (TDynamicStack *) malloc(sizeof(tdynamicstack)); if ( NewItem!= NULL ) { NewItem->Item = Item; NewItem->Next = *s; *s = NewItem; return ( true ); } else { return ( false ); } // if } // DynamicStack_Push 44

Παράδειγμα δυναμικής στοίβας (4/18) bool DynamicStack_Pop(TDynamicStack **s, TItem *Item) { if ( *s == NULL ) return ( false ); TDynamicStack *s = (*s)->next; *Item = Tmp->Item; free(tmp); return ( true ); } // DynamicStack_Pop *Tmp = *s; 45

Παράδειγμα δυναμικής στοίβας (5/18) bool DynamicStack_Top(TDynamicStack *s, TItem *Item) { if ( s == NULL ) return ( false ); *Item = s->item; return ( true ); } // DynamicStack_Top 46

Παράδειγμα δυναμικής στοίβας (6/18) size_t DynamicStack_Count(TDynamicStack *s) { TDynamicStack *Tmp = s; size_t Counter = 0; while ( Tmp!= NULL ) { Tmp = Tmp->Next; Counter++; } // while return ( Counter ); } // DynamicStack_Count 47

Παράδειγμα δυναμικής στοίβας (7/18) void DynamicStack_Deallocate(TDynamicStack **s) { TDynamicStack *Tmp = *s; while ( *s!= NULL ) { *s = (*s)->next; free(tmp); Tmp = *s; } // while } // DynamicStack_Deallocate 48

Παράδειγμα δυναμικής στοίβας (8/18) /* -------------------------------------------------------------------------- */ void main() { TDynamicStack *Head; TItem Item; //printf("head = 0x%08X\n", Head); DynamicStack_Init(&Head); printf("head = 0x%08X\n", Head); // Uninitialised value of head. // Initialise head. // Initialised value of head 49

Παράδειγμα δυναμικής στοίβας (9/18) if ( DynamicStack_IsEmpty(Head) ) printf("stack is Empty\n"); else printf("stack is NOT Empty\n"); printf("\n"); printf("push 10 onto stack.\n"); printf("------------------------------------------------\n"); printf("items on stack: %2d\n", DynamicStack_Count(Head)); DynamicStack_Push(&Head, 10); printf("head = 0x%08X\n", Head); printf("items on stack: %2u\n", DynamicStack_Count(Head)); 50

Παράδειγμα δυναμικής στοίβας (10/18) printf("\n"); printf("pop 10 from stack.\n"); printf("------------------------------------------------\n"); DynamicStack_Pop(&Head, &Item); printf("head = 0x%08X\n", Head); printf("item = %d\n", Item); printf("items on stack: %2u\n", DynamicStack_Count(Head)); 51

Παράδειγμα δυναμικής στοίβας (11/18) printf("\n"); printf("push 20 onto stack.\n"); printf("------------------------------------------------\n"); DynamicStack_Push(&Head, 20); printf("head = 0x%08X\n", Head); printf("items on stack: %2u\n", DynamicStack_Count(Head)); 52

Παράδειγμα δυναμικής στοίβας (12/18) printf("\n"); printf("read top of stack.\n"); printf("------------------------------------------------\n"); DynamicStack_Top(Head, &Item); printf("head = 0x%08X\n", Head); printf("item = %d\n", Item); 53

Παράδειγμα δυναμικής στοίβας (13/18) printf("\n"); printf("push 30 onto stack.\n"); printf("------------------------------------------------\n"); DynamicStack_Push(&Head, 30); printf("head = 0x%08X\n", Head); printf("items on stack: %2u\n", DynamicStack_Count(Head)); 54

Παράδειγμα δυναμικής στοίβας (14/18) printf("\n"); printf("read top of stack.\n"); printf("------------------------------------------------\n"); DynamicStack_Top(Head, &Item); printf("head = 0x%08X\n", Head); printf("item = %d\n", Item); 55

Παράδειγμα δυναμικής στοίβας (15/18) printf("\n"); printf("deallocate stack.\n"); printf("------------------------------------------------\n"); DynamicStack_Deallocate(&Head); printf("items on stack: %2u\n", DynamicStack_Count(Head)); printf("head = 0x%08X\n", Head); } // main 56

Παράδειγμα δυναμικής στοίβας (16/18) Η συγκεκριμένη υλοποίηση διαφέρει από τη στατική υλοποίηση, διότι τώρα χρησιμοποιούμε ένα μόνο δείκτη (αυτόν της κορυφής) για την περιγραφή της στοίβας. Έτσι, στις συναρτήσεις που υλοποιούν τις βασικές λειτουργίες χρησιμοποιούμε τη διεύθυνση του δείκτη (**) όταν ενδέχεται να μεταβάλλουμε μια στοίβα (read/write), και το δείκτη (*) όταν απλά χρησιμοποιούμε τη στοίβα μόνο για ανάγνωση (read only). 57

Παράδειγμα δυναμικής στοίβας (17/18) Ο τρόπος υλοποίησης των επιμέρους λειτουργιών είναι παρόμοιος με τη στατική στοίβα, αλλά αυτήν τη φορά δεσμεύουμε και αποδεσμεύουμε μνήμη με τις συναρτήσεις malloc και free, αντίστοιχα. Οι συνθήκες που καθορίζουν την επιτυχία ή αποτυχία μιας λειτουργίας παραμένουν οι ίδιες: Ώθηση ενός στοιχείου: επαρκής μνήμη. Ανάγνωση και αφαίρεση ενός στοιχείου: η στοίβα δεν είναι κενή. Ανάγνωση του στοιχείου στην κορυφή μιας στοίβας: η στοίβα δεν είναι κενή. 58

Παράδειγμα δυναμικής στοίβας (18/18) Μια εναλλακτική υλοποίηση θα ήταν μια αντίστοιχη της στατικής στοίβας, όπου θα έχουμε τη δήλωση της δομής της δυναμικής στοίβας, η οποία θα περιέχει το δείκτη της κεφαλής, καθώς, ίσως, και το μετρητή των στοιχείων της (αυτό θα πρέπει να κάνετε ως άσκηση παρακάτω). 59

Ερωτήσεις (1/2) Στο κυρίως πρόγραμμα παραπάνω η πρώτη εντολή είναι σχολιασμένη (αυτή που τυπώνει την τιμή του Head πριν την αρχικοποίηση). Δοκιμάστε να την επαναφέρετε και εκτελέστε το πρόγραμμα. Στην προειδοποίηση του Visual Studio επιλέξτε «Παράβλεψη», ώστε να εκτελεστεί το πρόγραμμα χωρίς να προκληθεί εξαίρεση. 60

Ερωτήσεις (2/2) Τι τιμή έχει ο δείκτης Head πριν την αρχικοποίηση; Επαναλάβετε το πείραμα 2-3 φορές ακόμη. Τί τιμή συνεχίζει να έχει ο δείκτης; Τί σημαίνει, ή αν προτιμάτε για ποιο λόγο είναι συγκεκριμένη, η τιμή που βλέπετε; 61

Ασκήσεις στις δυναμικές στοίβες

Άσκηση 1 Συμπληρώστε τον κώδικα της δυναμικής στοίβας, προσθέτοντας μια συνάρτηση που να επιστρέφει το πλήθος των φορών που εμφανίζεται ένα στοιχείο. Η στοίβα θα πρέπει, σε κάθε περίπτωση, να παραμένει αμετάβλητη. 63

Άσκηση 2 Υλοποιήστε συνάρτηση που να αφαιρεί ένα επιλεγμένο στοιχείο από τη στοίβα, όσες φορές κι αν αυτό υπάρχει. Κατά την υλοποίηση της συνάρτησης επιτρέπεται να διαβάζετε και να γράφετε μόνο στην αρχή της στοίβας (χρησιμοποιώντας τις Push και Pop). Δηλαδή, μην προχωράτε στη στοίβα προς τα κάτω αφαιρώντας τα ανεπιθύμητα στοιχεία. Η σειρά των στοιχείων της στοίβας πρέπει να παραμείνει η ίδια (χωρίς φυσικά τα διαγραφέντα στοιχεία), και η συνάρτηση να επιστρέφει το πλήθος των στοιχείων που αφαιρέθηκαν. 64

Άσκηση 3 Τροποποιήστε κατάλληλα των κώδικα των δυναμικών στοιβών ώστε δουλεύει με δομή της επιλογής σας (που πρέπει να έχει τουλάχιστον δύο πεδία). Δείξτε στο κυρίως πρόγραμμά σας την καλή λειτουργία των τροποποιήσεών σας. 65

Άσκηση 4 Τροποποιήστε κατάλληλα τον κώδικα που σας δόθηκε ώστε τώρα να κατασκευάσετε στοίβα πινάκων όπου ο καθένας έχει πέντε (5) στοιχεία μέσα του. 66

Άσκηση 5 (1/2) Υποθέστε ότι οι μόνοι τύποι παρενθέσεων που μπορείτε να έχετε σε έναν υπολογιστή χειρός που κατασκευάζετε είναι οι (), [], και {}. Οι πιο εξωτερικές είναι τα άγκιστρα {}, μετά οι αγκύλες [], και οι πιο εσωτερικές οι απλές παρενθέσεις (). Με τη βοήθεια στοιβών (που πρέπει να τροποποιήσετε κατάλληλα), υλοποιήστε συνάρτηση που δέχεται μια συμβολοσειρά που περιέχει μόνο τους έξι χαρακτήρες ()[]{}, αλλά πολλές φορές (π.χ. 20). 67

Άσκηση 5 (2/2) Αυτή η συνάρτηση θα πρέπει να ελέγχει την ορθότητα της σειράς των παρενθέσεων, καθώς και να υποδεικνύει το πρώτο λάθος που συναντάει κατά το συντακτικό έλεγχο (επιστρέφοντας τον αριθμό του χαρακτήρα που έχει πρόβλημα αρνητικό, όπως το -1, αν όλα πήγαν καλά). 68

Άσκηση 6 Τροποποιήστε ή και δημιουργήστε κατάλληλους τύπους δομών ώστε η υλοποίηση της δυναμικής στοίβας να μοιάζει με αυτή της στατικής. Έτσι θα αποφύγετε τους διπλούς δείκτες. Τροποποιήστε κατάλληλα τις συναρτήσεις που υλοποιούν τις διάφορες λειτουργίες, έτσι ώστε να μοιάζουν στη δήλωση με αυτές της στατικής στοίβας. Φροντίστε τώρα να ενημερώνετε σωστά το μετρητή των στοιχείων της στοίβας όταν προσθέτετε ή αφαιρείτε στοιχεία. 69

Άσκηση 7 (1/2) Υλοποιήστε αλληλεπιδραστικό πρόγραμμα (σε γραμμή εντολών) που δέχεται από το πληκτρολόγιο μια σειρά ανοιχτών ή κλειστών παρενθέσεων, ( ή ). Όταν το πρόγραμμα δέχεται ανοιχτή παρένθεση, τότε να τη βάζει σε στοίβα χαρακτήρων. Όταν δέχεται κλειστή παρένθεση, τότε να αφαιρεί μια ανοιχτή από τη στοίβα. 70

Άσκηση 7 (2/2) Το πρόγραμμα θα τερματίζει όταν δεχτεί οποιονδήποτε άλλο χαρακτήρα πέραν των ( και ). Στο κυρίως πρόγραμμά σας ελέγξτε την ισορροπία ή μη της εμφάνισης παρενθέσεων (δηλαδή όσες ανοίγουν πρέπει και να κλείνουν). 71

Άσκηση 8 (1/2) Προσπαθήστε να βρείτε πόσα στοιχεία μπορείτε να προσθέσετε σε μια δυναμική στοίβα μέχρι να αποτύχει η δέσμευση μνήμης. Κατόπιν τυπώστε τον αριθμό που βρήκατε. Τέλος αποδεσμεύστε τη μνήμη της στοίβας. Κατά την εκτέλεση του προγράμματός να λάβετε υπόψη ότι η εκτέλεσή του μπορεί να αργήσει αρκετά. 72

Άσκηση 8 (2/2) Αν πολλαπλασιάσετε το αριθμό που βρήκατε με το μέγεθος της δομής, σε τι συμπέρασμα καταλήγετε όσον αφορά την ποσότητα μνήμης που δεσμεύτηκε; Πώς συγκρίνεται το νούμερο αυτό με την ποσότητα μνήμης που θα έπρεπε να μπορείτε να δεσμεύσετε; Γιατί ενδέχεται να υπάρχει διαφορά; 73

Βιβλιογραφία (1/8) Aho AV, Hopcroft JE, and Ullman JD. (1974) The design and analysis of computer algorithms. USA, Addison-Wesley Publishing Company. 470 pp. ISBN 0-201-00029-6. ( 38.33, 46.76). Aho AV, Hopcroft JE, and Ullman JD. (1983) Data structures and algorithms. USA, Addison-Wesley Publishing Company. 427 pp. ISBN 0-201-00023-7. ( 43.65, 53.25). Bik AJC. (2004) The software vectorization handbook: applying multimedia extensions for maximum performance. USA, Intel Press. 236 pp. ISBN 0-9743649-2-4. ( 32.31, 46.63). 74

Βιβλιογραφία (2/8) Carrano FM and Henry T. (2013) Data abstraction and problem solving with C++: walls and mirrors. 6th ed. UK, Pearson Education Limited. 833 pp. ISBN10 0-273-76841-7, ISBN13 978-0-76841-8. Cormen TH, Leiserson CE, Rivest RL, and Stein C. (2012) Εισαγωγή στους αλγορίθμους. USA/Ελλάδα, MIT Press/Ίδρυμα Τεχνολογίας & Έρευνας - Πανεπιστημιακές Εκδόσεις Κρήτης. 1260 pp. ISBN 978-960-524-224-4. Dasgupta S, Papadimitriou C and Vazirani U. (2009) Αλγόριθμοι. Ελλάδα, Εκδόσεις Κλειδάριθμος. 416 σελ. ISBN13 978-960-461-211-6. 75

Βιβλιογραφία (3/8) Gerber R, Bik AJC, Smith KB and Tian X. (2006) The software optimization cookbook: high-performance recipes for IA-32 platforms. 2nd ed. USA, Intel Press. 404 pp. ISBN 0-9764832-1-1. ( 35.07, 50.61). Helman P and Veroff R. (1988) Walls and mirrors: intermediate problem solving and data structures. Modula 2 ed. USA, The Benjamin/Cummings Publishing Company, Inc. 625 pp. ( 23.95). Kleinberg J and Tardos W. (2008) Σχεδιασμός αλγορίθμων. Ελλάδα, Εκδόσεις Κλειδάριθμος. 944 σελ. ISBN13 978-960- 461-207-9. 76

Βιβλιογραφία (4/8) Knuth DE. (2009) Η τέχνη του προγραμματισμού: θεμελιώδεις αλγόριθμοι, Τόμος Α. 3η Έκδοση. Ελλάδα, Εκδόσεις Τζιόλα. 759 σελ. ISBN13 978-960-418-185-8. Knuth DE. (2010) Η τέχνη του προγραμματισμού: ημιαριθμητικοί αλγόριθμοι, Τόμος Β. 3η Έκδοση. Ελλάδα, Εκδόσεις Τζιόλα. 912 σελ. ISBN13 978-960-418-224-4. Knuth DE. (2010) Η τέχνη του προγραμματισμού: ταξινόμηση και αναζήτηση, Τόμος Γ. 2η Έκδοση. Ελλάδα, Εκδόσεις Τζιόλα. 926 σελ. ISBN13 978-960-418-245-9. 77

Βιβλιογραφία (5/8) Kruse RL and Ryba AJ. (1999) Data structures and program design in C++. USA, Prentice Hall. 717 pp. ISBN 0-13- 082640-5. ( 40.74). Lafore R. (2005) Δομές δεδομένων και αλγόριθμοι στη Java. Ελλάδα, Εκδόσεις Μ. Γκιούρδα. 798 σελ. ISBN10 960-512- 452-1. Levitin A. (2008) Εισαγωγή στην ανάλυση και σχεδίαση αλγορίθμων. 2η Έκδοση. Ελλάδα, Εκδόσεις Τζιόλα. 700 σελ. ISBN13 978-960-418-143-8. 78

Βιβλιογραφία (6/8) McConnell S. (1993) Code complete: a practical handbook of software construction. USA, Microsoft Press. 857 pp. ( 25.99). Mehlhorn K and Sanders P. (2008) Algorithms and data structures: the basic toolbox. Germany, Springer-Verlag Berlin Heidelberg. 300 pp. ISBN13 978-3-540-77977-3. ( 28.11, 34.29). Prichard JJ and Carrano FM. (2011) Data abstraction and problem solving with Java: walls and mirrors. 3rd ed. UK, Pearson Education Limited. 959 pp. ISBN10 0-273-75120-4. ISBN13 978-0-273-75120-5. 79

Βιβλιογραφία (7/8) Sahni S. (2004) Δομές Δεδομένων, Αλγόριθμοι, και Εφαρμογές στη C++. Ελλάδα/ΗΠΑ, Εκδόσεις Τζιόλα/McGraw-Hill. 830 σελ. ISBN10 960-418-030-4. Sedgewick R and Flajolet P. (2013) An introduction to the analysis of algorithms. 2nd ed. USA, Pearson Education, Inc. 572 pp. ISBN13 978-0-321-90575-8. Sedgewick R and Wayne K. (2011) Algorithms. 4th ed. USA, Pearson Education, Inc. 952 pp. ISBN13 978-0-321-57351-3. Κοίλιας Χ. (2004) Δομές δεδομένων & οργανώσεις αρχείων. Ελλάδα, Εκδόσεις Νέων Τεχνολογιών. 447 σελ. ISBN10 960-8105-64-1. 80

Βιβλιογραφία (8/8) Μποζάνης ΠΔ. (2006) Δομές Δεδομένων. Ελλάδα, Εκδόσεις Τζιόλα. 552 σελ. ISBN10 960-418-084-3. Μποζάνης ΠΔ. (2009) Προβλήματα & ασκήσεις στους αλγορίθμους. Ελλάδα, Εκδόσεις Τζιόλα. 492 σελ. ISBN13 978-960-418-186-5. Μποζάνης ΠΔ. (2013) Αλγόριθμοι. Ελλάδα, Εκδόσεις Τζιόλα. 549 σελ. ISBN13 978-960-418-070-1. Μυσιρλής Ν. (2002) Δομές δεδομένων με C. Ελλάδα, αυτοέκδοση. 347 σελ. ISBN10 960-92031-1-6. Παπαρίζος Κ. (2010) Ανάλυση και σχεδίαση αλγορίθμων. Ελλάδα, Εκδόσεις Τζιόλα. 606 σελ. ISBN13 978-960-418-222-0. 81

Τέλος Ενότητας

Σημείωμα Αναφοράς Copyright ΤΕΙ Δυτικής Μακεδονίας, Δρ. Γεώργιος Σίσιας. «Δομές Δεδομένων». Έκδοση: 1.0. Κοζάνη 2015. Διαθέσιμο από τη δικτυακή διεύθυνση: URL. 83

Σημείωμα Αδειοδότησης Το παρόν υλικό διατίθεται με τους όρους της άδειας χρήσης Creative Commons Αναφορά, Μη Εμπορική Χρήση Παρόμοια Διανομή 4.0 [1] ή μεταγενέστερη, Διεθνής Έκδοση. Εξαιρούνται τα αυτοτελή έργα τρίτων π.χ. φωτογραφίες, διαγράμματα κ.λ.π., τα οποία εμπεριέχονται σε αυτό και τα οποία αναφέρονται μαζί με τους όρους χρήσης τους στο «Σημείωμα Χρήσης Έργων Τρίτων». [1] http://creativecommons.org/licenses/by-nc-sa/4.0/ Ως Μη Εμπορική ορίζεται η χρήση: που δεν περιλαμβάνει άμεσο ή έμμεσο οικονομικό όφελος από την χρήση του έργου, για το διανομέα του έργου και αδειοδόχο. που δεν περιλαμβάνει οικονομική συναλλαγή ως προϋπόθεση για τη χρήση ή πρόσβαση στο έργο. που δεν προσπορίζει στο διανομέα του έργου και αδειοδόχο έμμεσο οικονομικό όφελος (π.χ. διαφημίσεις) από την προβολή του έργου σε διαδικτυακό τόπο. Ο δικαιούχος μπορεί να παρέχει στον αδειοδόχο ξεχωριστή άδεια να χρησιμοποιεί το έργο για εμπορική χρήση, εφόσον αυτό του ζητηθεί. 84

Διατήρηση Σημειωμάτων Οποιαδήποτε αναπαραγωγή ή διασκευή του υλικού θα πρέπει να συμπεριλαμβάνει: το Σημείωμα Αναφοράς. το Σημείωμα Αδειοδότησης. τη δήλωση Διατήρησης Σημειωμάτων. το Σημείωμα Χρήσης Έργων Τρίτων (εφόσον υπάρχει). μαζί με τους συνοδευόμενους υπερσυνδέσμους. 85