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

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

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

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

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

Δομές Δεδομένων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής. Δομές Δεδομένων. Τμήμα Εφαρμοσμένης Πληροφορικής

Δομές Δεδομένων. Ενότητα 4: Ο ΑΤΔ Λίστα & Υλοποίηση Λίστας με σειριακή αποθήκευση- Ο ΑΤΔ Συνδεδεμένη Λίστα- Υλοποίηση ΑΤΔ Συνδεδεμένη Λίστα με πίνακα

Δομές Δεδομένων. Ενότητα 7: Άλλες παραλλαγές Συνδεδεμένων Λιστών-Παράσταση Αραιού Πολυωνύμου με Συνδεδεμένη Λίστα. Καθηγήτρια Μαρία Σατρατζέμη

Δομές Δεδομένων. Ενότητα 12: Κατακερματισμός: Χειρισμός Συγκρούσεων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής.

Διαδικαστικός Προγραμματισμός

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

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

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

Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών

Δομές Δεδομένων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής. Δομές Δεδομένων. Τμήμα Εφαρμοσμένης Πληροφορικής

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

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

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

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

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

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών

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

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

Δομές Δεδομένων και Τεχνικές Προγραμματισμού Ενότητα 3: ΑΤΔ Ουρά. Ιωάννης Κοτρώνης Σχολή Θετικών Επιστημών Τμήμα Πληροφορικής και Τηλεπικοινωνιών

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

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Συστήματα Αυτομάτου Ελέγχου. Ενότητα Α: Γραμμικά Συστήματα

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

Ουρές (Queues) FIFO A B C. Διαγραφή. Εισαγωγή. εµπρός. πίσω. πίσω. πίσω

Περιεχόμενα Ορισμός και λειτουργία των μηχανών Turing Θεωρία Υπολογισμού Ενότητα 20: Μηχανές Turing: Σύνθεση και Υπολογισμοί Επ. Καθ. Π. Κατσαρός Τμήμ

Γραμμικές Δομές Δεδομένων

Δομές Δεδομένων. Ενότητα 11: Τεχνικές Κατακερματισμού. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής.

Επισκόπηση Μαθήματος. Γραμμικές Δομές Δεδομένων. ΑΤΔ Ουρά Εναλλακτικοί Σχεδιασμοί Προγραμματισμός με Ενότητες Interface.h Implementation.

ΓΡΑΜΜΙΚΟΣ & ΔΙΚΤΥΑΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

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

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

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

Σε μια στοίβα 10 θέσεων έχουν τοποθετηθεί διαδοχικά τα στοιχεία: Σ, Γ, Μ, Α, Δ στην 1η, 2η, 3η, 4η και 5η θέση αντίστοιχα. Να προσδιορίσετε την τιμή

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

ΥΠΟΛΟΓΙΣΤΕΣ ΙI. Άδειες Χρήσης. Δομή του προγράμματος. Διδάσκοντες: Αν. Καθ. Δ. Παπαγεωργίου, Αν. Καθ. Ε. Λοιδωρίκης

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

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

ΛΙΣΤΕΣ. Ορισμός ΑΤΔ Λίστα ΑΤΔ Ακολουθιακή Λίστα Διαχείριση Δεικτών και Λιστών στη C ΑΤΔ Συνδεδεμένη Λίστα. Εφαρμογές και Χρήση Λιστών

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

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

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

ΓΡΑΜΜΙΚΟΣ & ΔΙΚΤΥΑΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

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

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

ΣΤΑΤΙΣΤΙΚΗ ΕΠΙΧΕΙΡΗΣΕΩΝ

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

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

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

Πληροφορική. Εργαστηριακή Ενότητα 3 η : Επεξεργασία Κελιών Γραμμών & Στηλών. Ι. Ψαρομήλιγκος Τμήμα Λογιστικής & Χρηματοοικονομικής

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

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

ΒΟΗΘΗΤΙΚΕΣ ΣΗΜΕΙΩΣΕΙΣ

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

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

Διαδικαστικός Προγραμματισμός

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

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

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ

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

Θεωρία Πιθανοτήτων & Στατιστική

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

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

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

ΥΠΟΛΟΓΙΣΤΕΣ ΙI. Άδειες Χρήσης. Συναρτήσεις II Διδάσκοντες: Αν. Καθ. Δ. Παπαγεωργίου, Αν. Καθ. Ε. Λοιδωρίκης

ΣΤΑΤΙΣΤΙΚΗ ΑΝΑΛΥΣΗ ΜΕ ΧΡΗΣΗ Η/Υ

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

Διαδικαστικός Προγραμματισμός

Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών

ΣΤΑΤΙΣΤΙΚΗ ΑΝΑΛΥΣΗ ΜΕ ΧΡΗΣΗ Η/Υ

ΥΠΟΛΟΓΙΣΤΕΣ ΙI. Άδειες Χρήσης. Τύποι δεδομένων, μεταβλητές, πράξεις. Διδάσκοντες: Αν. Καθ. Δ. Παπαγεωργίου, Αν. Καθ. Ε. Λοιδωρίκης

ΜΑΘΗΜΑΤΙΚΑ ΓΙΑ ΟΙΚΟΝΟΜΟΛΟΓΟΥΣ

Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών

Θεωρία Πιθανοτήτων & Στατιστική

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

ΤΕΧΝΟΛΟΓΙΑ ΛΟΓΙΣΜΙΚΟΥ Ι

ΤΕΧΝΟΛΟΓΙΑ ΛΟΓΙΣΜΙΚΟΥ Ι

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

ΓΡΑΜΜΙΚΟΣ & ΔΙΚΤΥΑΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

{ int a = 5; { int b = 7; a = b + 3;

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

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

Προγραμματισμός Ι (ΗΥ120)

ΣΥΣΤΗΜΑΤΑ ΑΝΑΜΟΝΗΣ Queuing Systems Εισαγωγή

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

Υπολογιστικά Συστήματα

Αυτοματοποιημένη χαρτογραφία

Τίτλος Μαθήματος: ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ

Προγραμματισμός Ηλεκτρονικών Υπολογιστών 1

Μεταγλωττιστές. Ενότητα 6: Λεκτική ανάλυση (Μέρος 2 ο ) Αγγελική Σγώρα Τμήμα Μηχανικών Πληροφορικής ΤΕ

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

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

Ποσοτικές Μέθοδοι στη Διοίκηση Επιχειρήσεων Ι Σύνολο- Περιεχόμενο Μαθήματος

Θεωρία Πιθανοτήτων & Στατιστική

Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών

Transcript:

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

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

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

Σκοποί ενότητας Σκοπός της ενότητας είναι Να παρουσιάσει τον ΑΤΔ ουρά και της πράξεις που περιέχει καθώς και να δώσει ένα παράδειγμα χρήσης της ουράς. Να μελετηθεί ο ΑΤΔ ουρά η υλοποίηση της ουράς με πίνακα και χρήση δομής. 4

Περιεχόμενα ενότητας Εισαγωγή Βασικές λειτουργίες Ορισμός του ΑΤΔ ουρά Παράδειγμα Ουράς Χρήση ουράς για γραμμή αναμονής Παράδειγμα λειτουργίας ουράς Αποφυγή μετατοπίσεων Αποφυγή μετατοπίσεων: έλεγχος κενής ουράς Αποφυγή μετατοπίσεων: αποθηκευτική δομή Πακέτο για τον ΑΤΔ ουρά 5

Εισαγωγή Μια ουρά είναι μια "γραμμή αναμονής", όπως για παράδειγμα: μια ουρά ανθρώπων, που περιμένουν στο ταμείο ενός σουπερ-μάρκετ, ή μια ουρά εργασιών σ' ένα σύστημα υπολογιστή, που περιμένουν για κάποια συσκευή εξόδου, π.χ. έναν εκτυπωτή. Σε καθένα από τα παραδείγματα αυτά, τα αντικείμενα εξυπηρετούνται με την σειρά με την οποία φτάνουν, δηλαδή το πρώτο στοιχείο της ουράς είναι το πρώτο που θα εξυπηρετηθεί. 6

Στοίβα - Ουρά Ενώ, λοιπόν, μια στοίβα είναι μια "τελευταίος μέσα - πρώτος έξω" (Last In-First out, LIFO) δομή, η ουρά είναι μια "πρώτος μέσα - πρώτος έξω" (First In - First Out, FIFO) δομή. 7

Βασικές λειτουργίες ουράς Στην ουρά (queue) οι βασικές λειτουργίες εισαγωγής και διαγραφής πραγματοποιούνται στα δύο άκρα της. Αντίθετα με τις στοίβες, στις οποίες τα στοιχεία απωθούνται ή ωθούνται μόνο στο ένα άκρο της δομής δεδομένων, η διαγραφή ενός στοιχείου από την ουρά γίνεται στο ένα άκρο της, που ονομάζεται εμπρός (front) ή κεφάλι (head), και η εισαγωγή ενός νέου στοιχείου γίνεται στο άλλο άκρο της, που ονομάζεται πίσω (rear) ή ουρά (tail). 8

Οι βασικές λειτουργίες Ουράς Δημιουργία μιας κενής ουράς Έλεγχος αν μια ουρά είναι κενή Διαγραφή του στοιχείου που βρίσκεται στο εμπρός άκρο της ουράς Εισαγωγή νέου στοιχείου στο πίσω άκρο της ουράς. 9

Ορισμός του ΑΤΔ ουρά -1- Συλλογή στοιχείων δεδομένων: Μια συλλογή στοιχείων δεδομένων σε γραμμική διάταξη με την ιδιότητα ότι τα στοιχεία μπορούν να διαγράφονται μόνο από το ένα άκρο της, που ονομάζεται εμπρός, και να εισάγονται μόνο στο άλλο άκρο της, που ονομάζεται πίσω. 10

Ορισμός του ΑΤΔ ουρά -2- Βασικές λειτουργίες: Δημιουργία κενής ουράς (CreateQ) Λειτουργία: Δημιουργεί μια κενή ουρά. Επιστρέφει: Μια κενή ουρά. Έλεγχος αν μια ουρά είναι κενή (EmptyQ) Δέχεται: Μια ουρά. Λειτουργία: Ελέγχει αν η ουρά είναι κενή. Επιστρέφει: TRUE, αν η ουρά είναι κενή, FALSE διαφορετικά. 11

Ορισμός του ΑΤΔ ουρά -3- Διαγραφή στοιχείου από το εμπρός άκρο της ουράς (RemoveQ) Δέχεται: Μια ουρά. Λειτουργία: Ανακτά και διαγράφει το στοιχείο που βρίσκεται στο εμπρός άκρο της ουράς. Επιστρέφει: Το στοιχείο στο εμπρός άκρο της ουράς και την τροποποιημένη ουρά. Εισαγωγή στοιχείου στο πίσω άκρο της ουράς (AddQ): Δέχεται: Μια ουρά και ένα στοιχείο δεδομένου. Λειτουργία: Εισάγει το στοιχείο στο πίσω άκρο της ουράς. Επιστρέφει: Την τροποποιημένη ουρά. 12

Παράδειγμα -1- Η ουρά είναι μια κατάλληλη δδ για την αποθήκευση στοιχείων τα οποία θα υποστούν επεξεργασία με τη σειρά με την οποία δημιουργήθηκαν. Παράδειγμα: ας υποθέσουμε ότι ένα πρόγραμμα είναι φτιαγμένο να προσφέρει προβλήματα άσκησης για στοιχειώδη αριθμητική: Τα προβλήματα αυτά αφορούν την πρόσθεση τυχαίων ακεραίων αριθμών. Αν ο μαθητής απαντήσει σωστά, τότε δημιουργείται ένα άλλο πρόβλημα. Αν, όμως, δεν απαντήσει σωστά, τότε το πρόβλημα αποθηκεύεται προκειμένου να του ζητηθεί ξανά να το απαντήσει στο τέλος του μαθήματος. Όπως φαίνεται, τα προβλήματα που δεν απαντήθηκαν σωστά θα πρέπει να εμφανιστούν με την ίδια σειρά με την οποία εμφανίστηκαν αρχικά. Επομένως, μια ουρά είναι η κατάλληλη δομή δεδομένων για την αποθήκευση αυτών των προβλημάτων. 13

Παράδειγμα -2- Έστω ότι έχει αναπτυχθεί ένα πακέτο ή μονάδα για τον ΑΤΔ Ουρά ώστε να ορίζει έναν τύπο δεδομένων QueueType, ο οποίος μπορεί να χρησιμοποιηθεί για τη δήλωση μιας ουράς WrongQueue εγγραφών προβλημάτων της μορφής typedef struct { int Addend1, Addend2; } QueueElementType; καθώς και διαδικασίες CreateQ, AddQ και RemoveQ και μια boolean συνάρτηση EmptyQ για τις λειτουργίες της ουράς.. 14

Παράδειγμα -3- Τότε προτάσεις σαν τις ακόλουθες μπορούν να χρησιμοποιηθούν για τη δημιουργία ενός προβλήματος και την πρόσθεσή του στην WrongQueue, αν δεν απαντηθεί σωστά: CreateQ(WrongQueue); Problem.Addend1 = RandomInt(0, NumberLimit); Problem.Addend2 = RandomInt(0, NumberLimit); Ask(Problem,Correct,1); if (!Correct) AddQ(&WrongQ,Problem); 15

Παράδειγμα -4- Η RandomInt είναι μια συνάρτηση που δημιουργεί τυχαίους ακεραίους από ένα καθορισμένο εύρος ακεραίων αριθμών. Η διαδικασία Ask εμφανίζει ένα πρόβλημα πρόσθεσης στο μαθητή, διαβάζει μια απάντηση και επιστρέφει την τιμή TRUE ή FALSE για την boolean παράμετρο Correct για να δηλώσει αν η απάντηση ήταν σωστή. Η παράμετρος 1 δηλώνει το πόσες φορές έχει ζητηθεί το πρόβλημα. 16

Παράδειγμα -5- Στην συνέχεια, μπορούν να χρησιμοποιηθούν οι ακόλουθες προτάσεις για την επανάληψη των προβλημάτων που δεν απαντήθηκαν σωστά: while (!EmptyQ(WrongQ)) { } RemoveQ(&WrongQ, &Problem); Ask(Problem,Correct, 2); if (!Correct) Wrong ++ 17

Εισαγωγή -1- Επειδή οι ουρές μοιάζουν πολύ με τις στοίβες, μπορούμε να υλοποιήσουμε μια ουρά χρησιμοποιώντας πάλι πίνακες. Για την ουρά, λοιπόν, χρειαζόμαστε έναν πίνακα, Queue, για την αποθήκευση των στοιχείων της ουράς, και δύο μεταβλητές: την μεταβλητή Front, όπου θα αποθηκεύεται η θέση του πίνακα στην οποία βρίσκεται το στοιχείο που μπορεί να διαγραφεί, δηλαδή το πρώτο στοιχείο της ουράς, και την Rear, όπου θα αποθηκεύεται η θέση του πίνακα στην οποία μπορεί να εισαχθεί ένα νέο στοιχείο, δηλαδή η θέση μετά το τελευταίο στοιχείο της ουράς. 18

Εισαγωγή -2- Ένα στοιχείο, λοιπόν, μπορεί να διαγραφεί από την ουρά: ανακτώντας το στοιχείο που βρίσκεται στην θέση Front του πίνακα Queue, δηλαδή Queue[Front], και αυξάνοντας την μεταβλητή Front κατά 1. Ένα στοιχείο εισάγεται στην ουρά: με αποθήκευσή του στην θέση Rear του πίνακα Queue, δηλαδή Queue[Rear], με την προϋπόθεση, βέβαια ότι η μεταβλητή Rear είναι μικρότερη του ορίου του πίνακα, και αυξάνοντας την μεταβλητή Rear κατά 1. Η δυσκολία εδώ είναι ότι τα στοιχεία μετατοπίζονται προς τα δεξιά μέσα στον πίνακα, πράγμα το οποίο σημαίνει ότι ίσως να χρειαστεί όλα τα στοιχεία του πίνακα να μετατοπιστούν πίσω στις αρχικές θέσεις. 19

Παράδειγμα -6- Για να γίνει κατανοητή η λειτουργία της ουράς, ας θεωρήσουμε μια ουρά 5 θέσεων στην οποία: εισάγονται με τη σειρά οι αριθμοί 30, 17 και 25, εν συνεχεία διαγράφονται οι 30 και 17 και, τέλος, εισάγονται οι 7 και 53, όπως δείχνουν τα ακόλουθα σχήματα. Εισαγωγή του 30 Queue θέση 1 2 3 4 5 αριθμός 30 Εισαγωγή του 17 Queue θέση 1 2 3 4 5 αριθμός 30 17 Εισαγωγή του 25 Queue θέση 1 2 3 4 5 αριθμός 30 17 25 20

Παράδειγμα -7- Queue θέση 1 2 3 4 5 αριθμός 17 25 Διαγραφή του 30 Queue θέση 1 2 3 4 5 αριθμός 25 Queue θέση 1 2 3 4 5 αριθμός 25 7 Queue θέση 1 2 3 4 5 Διαγραφή του 17 Εισαγωγή του 7 Εισαγωγή του 53 αριθμός 25 7 53 21

Παράδειγμα -8- Στο σημείο αυτό, για να εισάγουμε έναν νέο αριθμό στην ουρά θα πρέπει πρώτα να μετατοπίσουμε τους 3 αριθμούς στις πρώτες θέσεις του πίνακα. Queue θέση 1 2 3 4 5 αριθμός 25 7 53 22

Αποφυγή μετατοπίσεων -1- Για να αποφύγουμε τις μετατοπίσεις, μπορούμε να θεωρήσουμε έναν κυκλικό πίνακα, όπου το πρώτο στοιχείο ακολουθεί το τελευταίο. Αυτό μπορεί να γίνει αν σχήματα: δεικτοδοτήσουμε τον πίνακα, ξεκινώντας από το 0, και αυξάνουμε τις μεταβλητές Front και Rear, ώστε να παίρνουν τιμές από 0 μέχρι το όριο της ουράς. Οι παραπάνω πράξεις εισαγωγής και διαγραφής γίνονται όπως δείχνουν τα 23

Αποφυγή μετατοπίσεων -2- Εισαγωγή των 30, 17 και 25 Διαγραφή των 30 και 17 Εισαγωγή των 7 και 53 Τώρα μπορούμε να εισαγάγουμε νέο στοιχείο στη θέση 0 χωρίς να χρειάζεται να μετακινήσουμε τα υπόλοιπα. 24

Αποφυγή μετατοπίσεων: έλεγχος κενής ουράς -1- Εξέταση της βασικής διαδικασίας EmptyQ που καθορίζει αν η ουρά είναι κενή: Αν η ουρά περιέχει ένα μόνο στοιχείο, τότε αυτό βρίσκεται στη θέση Front του πίνακα και η Rear είναι η κενή θέση που ακολουθεί. Αν αυτό το στοιχείο διαγραφεί, η μεταβλητή Front αυξάνεται κατά 1 και η Rear έχει την ίδια τιμή. Επομένως, για να καθορίσουμε αν η ουρά είναι κενή, το μόνο που χρειάζεται να κάνουμε είναι να ελέγξουμε τη συνθήκη Front == Rear. Αρχικά, η CreateQ θέτει τις Front και Rear ίσες με 0. Όπως στην υλοποίηση της στοίβας με πίνακα υπήρχε η πιθανότητα γεμάτης στοίβας, έτσι και στην υλοποίηση της ουράς προκύπτει η πιθανότητα γεμάτης ουράς.. 25

Αποφυγή μετατοπίσεων: έλεγχος κενής ουράς -2- Εξέταση της βασικής διαδικασίας EmptyQ που καθορίζει αν η ουρά είναι κενή: Αν η ουρά περιέχει ένα μόνο στοιχείο, τότε αυτό βρίσκεται στη θέση Front του πίνακα και η Rear είναι η κενή θέση που ακολουθεί. Αν αυτό το στοιχείο διαγραφεί, η μεταβλητή Front αυξάνεται κατά 1 και η Rear έχει την ίδια τιμή. Επομένως, για να καθορίσουμε αν η ουρά είναι κενή, το μόνο που χρειάζεται να κάνουμε είναι να ελέγξουμε τη συνθήκη Front == Rear. Αρχικά, η CreateQ θέτει τις Front και Rear ίσες με 0. Όπως στην υλοποίηση της στοίβας με πίνακα υπήρχε η πιθανότητα γεμάτης στοίβας, έτσι και στην υλοποίηση της ουράς προκύπτει η πιθανότητα γεμάτης ουράς.. 26

Αποφυγή μετατοπίσεων: έλεγχος γεμάτης ουράς Επομένως, η συνθήκη που δείχνει αν η ουρά είναι γεμάτη είναι τώρα η (Rear+1) % QueueLimit == Front, όπου QueueLimit είναι το μέγιστο μέγεθος της ουράς. Αν ένα στοιχείο αποθηκευόταν σ' αυτήν τη θέση, τότε η Rear θα αυξανόταν κατά 1 και θα είχε την ίδια τιμή με την Front. Όμως, η συνθήκη Front==Rear δηλώνει ότι η ουρά είναι κενή. Έτσι, λοιπόν, δεν θα μπορούσαμε να ξεχωρίσουμε μια κενή ουρά από μια γεμάτη αν αυτή η θέση χρησιμοποιούνταν για την αποθήκευση ενός στοιχείου. Κάτι τέτοιο μπορεί να αποφευχθεί αν διατηρούμε μια κενή θέση στον πίνακα.. 27

Αποφυγή μετατοπίσεων : αποθηκευτική δομή -1- Για να υλοποιήσουμε μια ουρά, μπορούμε να χρησιμοποιήσουμε ως αποθηκευτική δομή μια εγγραφή : αποτελούμενη από έναν κυκλικό πίνακα, τον Element, για την αποθήκευση των στοιχείων της ουράς, και από τα πεδία Front και Rear, όπου αποθηκεύουμε τη θέση της εμπρός άκρης της ουράς και τη θέση που ακολουθεί αμέσως μετά την πίσω άκρη της ουράς. 28

Αποφυγή μετατοπίσεων : #define QueueLimit 20 typedef int QueueElementType; /* ο τύπος των στοιχείων της ουράς ενδεικτικά τύπου int */ typedef struct { int Front, Rear; QueueElementType Element[QueueLimit]; } QueueType; αποθηκευτική δομή -2- Η λειτουργία δημιουργίας μιας κενής ουράς συνίσταται απλά στο να τεθούν οι μεταβλητές Front και Rear της ουράς ίσες με 0, και μια ουρά είναι κενή όταν η boolean έκφραση Queue.Front == Queue.Rear είναι αληθής. 29

Πακέτο για τον ΑΤΔ ουρά -1- /*Filename: QueueADT.h */ #define QueueLimit 20 /*μέγιστο μέγεθος της ουράς*/ typedef int QueueElementType; // ο τύπος των στοιχείων της ουράς ενδεικτικά τύπου int typedef struct { int Front, Rear; QueueElementType Element[QueueLimit];; } QueueType; typedef enum {FALSE, TRUE} boolean; 30

Πακέτο για τον ΑΤΔ ουρά -2- void CreateQ(QueueType *Queue); boolean EmptyQ(QueueType Queue); boolean FullQ(QueueType Queue); void RemoveQ(QueueType *Queue, QueueElementType *Item); void AddQ(QueueType *Queue, QueueElementType Item); 31

Πακέτο για τον ΑΤΔ ουρά -3- /*Filename: QueueADT.c */ #include <stdio.h> #include QueueADT.h void CreateQ(QueueType *Queue) /* Λειτουργία: Δημιουργεί μια κενή ουρά. Επιστρέφει: Κενή ουρά.*/ { Queue->Front = 0; Queue->Rear = 0; } 32

Πακέτο για τον ΑΤΔ ουρά -4- boolean EmptyQ(QueueType Queue) /*Δέχεται: Μια ουρά. Λειτουργία: Ελέγχει αν η ουρά είναι κενή. Επιστρέφει: TRUE αν η ουρά είναι κενή, FALSE διαφορετικά.*/ { } return (Queue.Front == Queue.Rear); 33

Πακέτο για τον ΑΤΔ ουρά -5- boolean FullQ(QueueType Queue) /*Δέχεται: Μια ουρά. Λειτουργία: Ελέγχει αν η ουρά είναι γεμάτη. Επιστρέφει: TRUE αν η ουρά είναι γεμάτη, FALSE διαφορετικά.*/ { } return ((Queue.Front) == ((Queue.Rear +1) % QueueLimit)); 34

Πακέτο για τον ΑΤΔ ουρά -6- void RemoveQ(QueueType *Queue, QueueElementType *Item) /*Δέχεται: Μια ουρά. Λειτουργία: Αφαιρεί το στοιχείο Item από την εμπρός άκρη της ουράς αν η ουρά δεν είναι κενή. Επιστρέφει: Το στοιχείο Item και την τροποποιημένη ουρά. Έξοδος: Μήνυμα κενής ουρά αν η ουρά είναι κενή.*/ 35

Πακέτο για τον ΑΤΔ ουρά -7- { if (! EmptyQ(*Queue)) { *Item = Queue ->Element[Queue -> Front]; Queue ->Front = (Queue ->Front + 1) % QueueLimit; } else printf("empty Queue\n"); } 36

Πακέτο για τον ΑΤΔ ουρά -8- void AddQ(QueueType *Queue, QueueElementType Item) /*Δέχεται: Μια ουρά Queue και ένα στοιχείο Item. Λειτουργία: Προσθέτει το στοιχείο Item στην ουρά Queue αν η ουρά δεν είναι γεμάτη. Επιστρέφει: Την τροποποιημένη ουρά. Έξοδος: Μήνυμα γεμάτης ουράς αν η ουρά είναι γεμάτη.*/ { 37

Πακέτο για τον ΑΤΔ ουρά -9- { } int NewRear; if (!FullQ(*Queue)) { NewRear = (Queue ->Rear + 1) % QueueLimit; Queue ->Element[Queue ->Rear] = Item; Queue ->Rear = NewRear; } else printf("full Queue"); 38

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