Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.
∆οµές ∆εδοµένων σε C
Μάθηµα 3:
Ουρά
∆ηµήτρης Ψούνης
Περιεχόµενα Μαθήµατος
Α. Θεωρία
1. Ουρά
1. Ορισµός Ουράς
2. Βασικές Πράξεις
2. Απλή Ουρά µε Πίνακα
1. Γενικά
2. Υλοποίηση ...
A. Θεωρία
1. Ουρά
1. Ορισµός Ουράς
3∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά
Η «Ουρά» είναι µια δοµή δεδοµένω...
A. Θεωρία
1. Ουρά
2. Βασικές Πράξεις
4∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά
Οι βασικές πράξεις σε µία ουρά...
A. Θεωρία
2. Απλή Ουρά µε Πίνακα
1. Εισαγωγή
5∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά
Στην πρώτη υλοποίηση (...
A. Θεωρία
2. Απλή Ουρά µε Πίνακα
2. Υλοποίηση σε C: ∆ηλώσεις
6∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά
Οι δηλ...
A. Θεωρία
2. Απλή Ουρά µε Πίνακα
3. Υλοποίηση σε C: Αρχικοποίηση Ουράς
7∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ο...
A. Θεωρία
2. Απλή Ουρά µε Πίνακα
4. Υλοποίηση σε C: Έλεγχοι – Κενή Ουρά και Γεµάτη Ουρά
8∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων ...
5
A. Θεωρία
2. Απλή Ουρά µε Πίνακα
5. Υλοποίηση σε C: Προσθήκη Στοιχείου
9∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3:...
A. Θεωρία
2. Απλή Ουρά µε Πίνακα
6. Υλοποίηση σε C: Αποµάκρυνση Στοιχείου
10∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα ...
A. Θεωρία
2. Απλή Ουρά µε Πίνακα
6. Υλοποίηση σε C: Αποµάκρυνση Στοιχείου
11∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα ...
A. Θεωρία
2. Απλή Ουρά µε Πίνακα
7. Υλοποίηση σε C: Παράδειγµα
12∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά
Μετ...
A. Θεωρία
3. Κυκλική Ουρά
1. Η ανάγκη για την Κυκλική Ουρά
13∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά
Η πράξη...
A. Θεωρία
3. Κυκλική Ουρά
1. Η ανάγκη για την Κυκλική Ουρά
14∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά
Για να ...
A. Θεωρία
3. Κυκλική Ουρά
2. Υλοποίηση σε C: ∆ηλώσεις
15∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά
Οι δηλώσεις ...
A. Θεωρία
3. Κυκλική Ουρά
3. Υλοποίηση σε C: Αρχικοποίηση Ουράς
16∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά
Η ...
A. Θεωρία
3. Κυκλική Ουρά
4. Υλοποίηση σε C: Έλεγχοι – Κενή Ουρά
17∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά
Ο...
A. Θεωρία
3. Κυκλική Ουρά
5. Υλοποίηση σε C: Έλεγχοι – Γεµάτη Ουρά
18∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά...
A. Θεωρία
3. Κυκλική Ουρά
6. Υλοποίηση σε C: Προσθήκη Στοιχείου
19∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά
Η ...
A. Θεωρία
3. Κυκλική Ουρά
6. Υλοποίηση σε C: Προσθήκη Στοιχείου
20∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά
/*...
start=1
A. Θεωρία
3. Κυκλική Ουρά
6. Υλοποίηση σε C: Αποµάκρυνση Στοιχείου
21∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα...
A. Θεωρία
3. Κυκλική Ουρά
6. Υλοποίηση σε C: Αποµάκρυνση Στοιχείου
22∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά...
A. Θεωρία
3. Κυκλική Ουρά
7. Υλοποίηση σε C: Παράδειγµα
23∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά
Μεταγλωττί...
Β. Ασκήσεις
Εφαρµογή 1: Ταµεία Τράπεζας
∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά
24
Κατασκευάστε ένα πρόγραµµ...
Β. Ασκήσεις
Εφαρµογή 2: Ουρά Προτεραιότητας
∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά
25
Η ουρά προτεραιότητας...
Β. Ασκήσεις
Εφαρµογή 3: Εκτύπωση Στοιχείων Ουράς
∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά
26
Θεωρείστε την κυ...
Β. Ασκήσεις
Εφαρµογή 4: Αντιστροφή Ουράς
∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά
27
Επεκτείνετε το project τ...
Próxima SlideShare
Cargando en…5
×

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 3

2.715 visualizaciones

Publicado el

.

Publicado en: Educación
  • Sé el primero en comentar

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 3

  1. 1. ∆οµές ∆εδοµένων σε C Μάθηµα 3: Ουρά ∆ηµήτρης Ψούνης
  2. 2. Περιεχόµενα Μαθήµατος Α. Θεωρία 1. Ουρά 1. Ορισµός Ουράς 2. Βασικές Πράξεις 2. Απλή Ουρά µε Πίνακα 1. Γενικά 2. Υλοποίηση σε C: ∆ηλώσεις 3. Υλοποίηση σε C: Αρχικοποίηση 4. Υλοποίηση σε C: Έλεγχοι – Κενή Ουρά και Γεµάτη Ουρά 5. Υλοποίηση σε C: Προσθήκη Στοιχείου 6. Υλοποίηση σε C: Αποµάκρυνση Στοιχείου 7. Υλοποίηση σε C: Παράδειγµα 2∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά 3. Κυκλική Ουρά 1. Γενικά 2. Υλοποίηση σε C: ∆ηλώσεις 3. Υλοποίηση σε C: Αρχικοποίηση 4. Υλοποίηση σε C: Έλεγχοι – Κενή Ουρά 5. Υλοποίηση σε C: Έλεγχοι – Γεµάτη Ουρά 6. Υλοποίηση σε C: Προσθήκη Στοιχείου 7. Υλοποίηση σε C: Αποµάκρυνση Στοιχείου 8. Υλοποίηση σε C: Παράδειγµα Β. Ασκήσεις
  3. 3. A. Θεωρία 1. Ουρά 1. Ορισµός Ουράς 3∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά Η «Ουρά» είναι µια δοµή δεδοµένων µε γραµµική διάταξη στην οποία: • Η προσθήκη (enqueue) ενός στοιχείου, γίνεται στο τέλος της ουράς • Η αποµάκρυνση (dequeue) ενός στοιχείου, γίνεται στην αρχή της ουράς enqueue(2) 2 Παράδειγµα: • Η ουρά των πελατών στο ταµείο µιας τράπεζας! Σηµαντική Ιδιότητα: • Το πρώτο στοιχείο που προστέθηκε στην ουρά είναι το πρώτο που θα εξαχθεί (First In – First Out: FIFO) enqueue(4) 2 4 4 dequeue( ) enqueue(5) 4 enqueue(3) 4 5 5 3
  4. 4. A. Θεωρία 1. Ουρά 2. Βασικές Πράξεις 4∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά Οι βασικές πράξεις σε µία ουρά είναι: • Αρχικοποίηση της ουράς (init) • Προσθήκη ενός στοιχείου στην ουρά (enqueue) • Αποµάκρυνση ενός στοιχείου από τη ουρά (dequeue) • Έλεγχος αν η ουρά είναι κενή (empty) • Έλεγχος αν η ουρά είναι γεµάτη (full) Υπάρχουν τρεις υλοποιήσεις: • Με στατικό πίνακα (σηµερινό µάθηµα) • Απλή ουρά (µε πίνακα) • Κυκλική ουρά • Με απλά συνδεδεµένη λίστα (επόµενο µάθηµα)
  5. 5. A. Θεωρία 2. Απλή Ουρά µε Πίνακα 1. Εισαγωγή 5∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά Στην πρώτη υλοποίηση (απλή ουρά) θα χρησιµοποιήσουµε: • Έναν στατικό πίνακα N θέσεων για να αποθηκεύσουµε τα στοιχεία της ουράς • Μία ακέραια µεταβλητή (finish) που θα δείχνει το τέλος της ουράς • (Εννοείται ότι η αρχή της ουράς θα είναι το 0) Γλώσσα C a[0] … a[1] a[2] a[2] a[N-1] finish=2 4 5 34 5 3 Ουρά
  6. 6. A. Θεωρία 2. Απλή Ουρά µε Πίνακα 2. Υλοποίηση σε C: ∆ηλώσεις 6∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά Οι δηλώσεις σε C είναι οι ακόλουθες: • Η ουρά είναι µία δοµή (struct) µε τα εξής στοιχεία: • Ένας πίνακας µε QUEUE_SIZE στοιχεία • Μία ακέραια µεταβλητή (finish) που δείχνει το τέλος της ουράς µε τιµή: • Από 0…QUEUE_SIZE-1 αν η ουρά έχει τουλάχιστον ένα στοιχείο • -1 αν η ουρά είναι άδεια. #define QUEUE_SIZE 10 /* Megethos pinaka ouras */ typedef int elem; /* typos dedomenwn ouras */ struct queue{ elem array[QUEUE_SIZE]; /* pinakas stoixeiwn */ int finish; /* telos tis ouras */ }; typedef struct queue QUEUE; /* Sinwnimo tis ouras */ … finish=2 2 6 4 Αναπαράσταση: 0 1 2 3 QUEUE_SIZE-1 array
  7. 7. A. Θεωρία 2. Απλή Ουρά µε Πίνακα 3. Υλοποίηση σε C: Αρχικοποίηση Ουράς 7∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά Η αρχικοποίηση γίνεται θέτοντας το τέλος της ουράς ίσο µε -1 /* QU_init(): arxikopoiei tin oura */ void QU_init(QUEUE *q) { q->finish=-1; } … finish=?? ΠΡΙΝ: 0 1 2 3 QUEUE_SIZE-1 array … finish=-1 0 1 2 3 QUEUE_SIZE-1 array ΜΕΤΑ: Προσοχή: • Πάντα προτού ξεκινάµε την χρήση της ουράς θα πρέπει να καλούµε µία φορά αυτήν τη συνάρτηση!
  8. 8. A. Θεωρία 2. Απλή Ουρά µε Πίνακα 4. Υλοποίηση σε C: Έλεγχοι – Κενή Ουρά και Γεµάτη Ουρά 8∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά Ο έλεγχος αν η ουρά είναι κενή (αντίστοιχα γεµάτη), γίνεται βλέποντας αν η µεταβλητή finish είναι ίση µε -1 (αντίστοιχα N-1) /* QU_empty(): epistrefei TRUE/FALSE * analoga me to an i oura einai adeia */ int QU_empty(QUEUE q) { return q.finish==-1; } /* QU_full(): epistrefei TRUE/FALSE * analoga me to an i oura einai gemati */ int QU_full(QUEUE q) { return q.finish==QUEUE_SIZE-1; }
  9. 9. 5 A. Θεωρία 2. Απλή Ουρά µε Πίνακα 5. Υλοποίηση σε C: Προσθήκη Στοιχείου 9∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά Η προσθήκη στην ουρά γίνεται προωθώντας το στοιχείο στη θέση finish+1 (εφόσον χωράει στην ουρά) /* QU_enqueue(): Eisagei to x stin oura q * epistrefei TRUE: se periptwsi epitixias * FALSE: se periptwsi apotixias */ int QU_enqueue(QUEUE *q,elem x) { if (QU_full(*q)) return FALSE; else { q->finish++; q->array[q->finish]=x; return TRUE; } } … finish=2 2 6 4 0 1 2 3 QUEUE_SIZE-1 array ΠΡΙΝ: ΜΕΤΑ (π.χ. προσθήκη του «5»): … finish=3 2 6 4 0 1 2 3 QEUEUE_SIZE-1 array
  10. 10. A. Θεωρία 2. Απλή Ουρά µε Πίνακα 6. Υλοποίηση σε C: Αποµάκρυνση Στοιχείου 10∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά Η αποµάκρυνση (του πρώτου) στοιχείου της ουράς γίνεται ως εξής: 1. Αποθηκεύεται το στοιχείο που είναι στην αρχή της ουράς (για να επιστραφεί) 2. Μετακινούνται τα υπόλοιπα στοιχεία κατά µία θέση αριστερά 3. ∆ιορθώνεται το finish (µειώνεται κατά 1) … finish=2 2 6 4 0 1 2 3 QUEUE_SIZE-1 array ΠΡΙΝ: ΜΕΤΑ: …6 4 0 1 2 3 QUEUE_SIZE-1 array finish=1 *x=2
  11. 11. A. Θεωρία 2. Απλή Ουρά µε Πίνακα 6. Υλοποίηση σε C: Αποµάκρυνση Στοιχείου 11∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά /* QU_dequeue(): Kanei apomakrinsi tou prwtou stoixeiou tis ouras * epistrefei TRUE: se periptwsi epitixias * FALSE: se periptwsi apotixias */ int QU_dequeue(QUEUE *q,elem *x) { int i; if (QU_empty(*q)) return FALSE; else { /* 1. Apothikeysi tou stoixeiou pou eksagetai*/ *x=q->array[0]; /* 2. Aristeri metakinisi twn stoixeiwn kata mia thesi */ for (i=0; i<q->finish; i++) q->array[i]=q->array[i+1]; /* 3. To finish meiwnetai kata 1 */ q->finish--; return TRUE; } }
  12. 12. A. Θεωρία 2. Απλή Ουρά µε Πίνακα 7. Υλοποίηση σε C: Παράδειγµα 12∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά Μεταγλωττίστε και εκτελέστε το project queue.dev στο οποίο: Το queue.h έχει τα πρωτότυπα των συναρτήσεων και την δήλωση της δοµής Το queue.c έχει τα σώµατα των συναρτήσεων Το main.c έχει ένα πρόγραµµα που επιδεικνύει την χρήση µίας ουράς ακεραίων. «Παίξτε» µε το πρόγραµµα ώστε να γίνει πλήρως κατανοητή η λειτουργία της ουράς. Υπενθύµιση: • Το σπάσιµο ενός προγράµµατος σε επιµέρους αρχεία µελετήθηκε στο «Γλώσσα C – Μάθηµα 14: Εµβέλεια Μεταβλητών»
  13. 13. A. Θεωρία 3. Κυκλική Ουρά 1. Η ανάγκη για την Κυκλική Ουρά 13∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά Η πράξη της αποµάκρυνσης απαιτεί την µετακίνηση των στοιχείων της ουράς κατά µία θέση αριστερά, το οποίο κρίνεται µη αποδοτικό. Μπορούµε να επιτύχουµε βελτίωση στο χρόνο αν βάλουµε άλλη µία µεταβλητή που να δείχνει την αρχή της ουράς και να έχουµε ως όρια της ουράς αυτές τις δύο µεταβλητές (χωρίς να κάνουµε µετακίνηση των στοιχείων της ουράς). Για παράδειγµα: enqueue(2) 2 enqueue(4) 2 4 4 dequeue( ) enqueue(5) 4 enqueue(3) 4 5 5 3 start=0 finish=0 start=0 finish=1 start=1 finish=1 start=1 finish=2 start=1 finish=3 start=-1 finish=-1
  14. 14. A. Θεωρία 3. Κυκλική Ουρά 1. Η ανάγκη για την Κυκλική Ουρά 14∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά Για να ξεπεραστεί το (νέο) πρόβληµα, ότι κάποια στιγµή θα φτάσουµε στο τέλος του πίνακα (οπότε και δεν θα µπορούµε να εισάγουµε ένα νέο στοιχείο στον πίνακα) Εισάγεται η έννοια της κυκλικής ουράς! Όπου πλέον όταν φτάσουµε στο τέλος του πίνακα οι νέες εισαγωγές θα γίνονται στην αρχή του πίνακα ∆ηλαδή βλέπουµε τον πίνακα ως κύκλο (όπου η επόµενη θέση της Ν-1 είναι η 0) 4 5 3 start=1 finish=3 0 1 2 3 array 4 5 6 7 0 array 1 2 34 5 6 7 start=1 finish=3 2 61 start=6finish=0 0 1 2 3 array 4 5 6 7 0 array 1 2 34 5 6 7start=6 finish=1 4 5 3 2 6 1
  15. 15. A. Θεωρία 3. Κυκλική Ουρά 2. Υλοποίηση σε C: ∆ηλώσεις 15∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά Οι δηλώσεις σε C είναι οι ακόλουθες: • Η ουρά είναι µία δοµή (struct) µε τα εξής στοιχεία: • Ένας πίνακας µε QUEUE_SIZE στοιχεία • ∆ύο ακέραιες µεταβλητές (start και finish) που δείχνουν αντίστοιχα την αρχή και το τέλος της ουράς µε τιµές (µε start=finish=-1 αν η ουρά είναι άδεια). #define QUEUE_SIZE 10 /* Megethos pinaka ouras */ typedef int elem; /* typos dedomenwn ouras */ struct queue{ elem array[QUEUE_SIZE]; /* pinakas stoixeiwn */ int start; /* arxi tis ouras */ int finish; /* telos tis ouras */ }; typedef struct queue QUEUE; /* Sinwnimo tis ouras */ Αναπαράσταση: 0 array 1 2 34 5 6 7 start=1 finish=3 4 5 3
  16. 16. A. Θεωρία 3. Κυκλική Ουρά 3. Υλοποίηση σε C: Αρχικοποίηση Ουράς 16∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά Η αρχικοποίηση γίνεται θέτοντας την αρχή και το τέλος της ουράς ίσο µε -1 /* QU_init(): arxikopoiei tin oura */ void QU_init(QUEUE *q) { q->start =-1; q->finish=-1; } ΠΡΙΝ: ΜΕΤΑ: 0 array 1 2 34 5 6 7 QUEUE_SIZE=8 start=?? finish=?? 0 array 1 2 34 5 6 7 QUEUE_SIZE=8 start=-1 finish=-1
  17. 17. A. Θεωρία 3. Κυκλική Ουρά 4. Υλοποίηση σε C: Έλεγχοι – Κενή Ουρά 17∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά Ο έλεγχος αν η ουρά είναι κενή γίνεται βλέποντας αν η µεταβλητή start (και η µεταβλητή finish) είναι ίση µε -1 • Αρκεί να ελέγξουµε τη µία από τις δύο (αφού µεριµνάµε ότι η υλοποίηση των βασικών πράξεων είναι ορθή και αυτός που χρησιµοποιεί την ουρά δεν έχει πρόσβαση στην υλοποίηση) /* QU_empty(): epistrefei TRUE/FALSE * analoga me to an i oura einai adeia */ int QU_empty(QUEUE q) { return q.finish==-1; }
  18. 18. A. Θεωρία 3. Κυκλική Ουρά 5. Υλοποίηση σε C: Έλεγχοι – Γεµάτη Ουρά 18∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά Ο έλεγχος αν η ουρά είναι γεµάτη γίνεται βλέποντας αν η µεταβλητή finish έχει τιµή 1 λιγότερο από τη µεταβλητή start (δηλαδή start==finish+1) • Μόνο στην περίπτωση που finish=QUEUE_SIZE-1 τότε πρέπει να ελέγξουµε αν start==0 Αυτό µπορεί να γίνει µε τον παρακάτω κοµψό κώδικα: /* QU_full(): epistrefei TRUE/FALSE * analoga me to an i oura einai gemati */ int QU_full(QUEUE q) { return q.start==(q.finish+1)%QUEUE_SIZE; } Υπενθύµιση: • Ο τελεστής % επιστρέφει το υπόλοιπο της διαίρεσης δύο αριθµών (Γλώσσα C – Μάθηµα 4). • Εδώ τον χρησιµοποιούµε ώστε µε µία εντολή να προκύπτει το start είτε ίσο µε την επόµενη θέση, είτε ίσο µε 0.
  19. 19. A. Θεωρία 3. Κυκλική Ουρά 6. Υλοποίηση σε C: Προσθήκη Στοιχείου 19∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά Η προσθήκη ενός στοιχείου στην ουρά γίνεται (εφόσον αυτή δεν είναι γεµάτη) ως εξής: • Το finish παίρνει τιµή την επόµενη θέση του πίνακα: • Την τιµή finish+1 (αν το finish < QUEUE_SIZE-1) • Την τιµή 0 (αν το finish = QUEUE_SIZE-1) • Το στοιχείο αποθηκεύεται στην θέση finish. ΠΡΙΝ: 0 array 1 2 34 5 6 7 start=1 finish=3 4 5 3 0 array 1 2 34 5 6 7 start=1 4 5 35 finish=4 QUEUE_SIZE=8 QUEUE_SIZE=8 5 ΜΕΤΑ (π.χ. προσθήκη του «5»):
  20. 20. A. Θεωρία 3. Κυκλική Ουρά 6. Υλοποίηση σε C: Προσθήκη Στοιχείου 20∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά /* QU_enqueue(): Eisagei to x stin oura q * epistrefei TRUE: se periptwsi epitixias * FALSE: se periptwsi apotixias */ int QU_enqueue(QUEUE *q,elem x) { if (QU_full(*q)) return FALSE; else { if (QU_empty(*q)) { q->start=0; q->finish=0; } else { q->finish=(q->finish+1)%QUEUE_SIZE; } q->array[q->finish]=x; return TRUE; } }
  21. 21. start=1 A. Θεωρία 3. Κυκλική Ουρά 6. Υλοποίηση σε C: Αποµάκρυνση Στοιχείου 21∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά Η αποµάκρυνση (του πρώτου) στοιχείου από την ουρά γίνεται (εφόσον αυτή δεν είναι άδεια): • Αποθηκεύοντας το στοιχείο της θέσης start (ώστε να επιστραφεί) και: • Αν το start είναι < από QUEUE_SIZE-1, τότε θέτουµε start=start+1 • Αν το start είναι = µε QUEUE_SIZE-1 τότε θέτουµε start=0 ΠΡΙΝ: 0 array 1 2 34 5 6 7 start=1 finish=3 4 5 3 0 array 1 2 34 5 6 7 5 3 QUEUE_SIZE=8 QUEUE_SIZE=8 5 ΜΕΤΑ *x=4 finish=3
  22. 22. A. Θεωρία 3. Κυκλική Ουρά 6. Υλοποίηση σε C: Αποµάκρυνση Στοιχείου 22∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά /* QU_dequeue(): Kanei apomakrinsi tou prwtou stoixeiou tis ouras * epistrefei TRUE: se periptwsi epitixias * FALSE: se periptwsi apotixias */ int QU_dequeue(QUEUE *q,elem *x) { if (QU_empty(*q)) return FALSE; else { *x=q->array[q->start]; if (q->start == q->finish) /* H oura adeiase */ { q->start=-1; q->finish=-1; } else { q->start=(q->start+1)%QUEUE_SIZE; } return TRUE; } }
  23. 23. A. Θεωρία 3. Κυκλική Ουρά 7. Υλοποίηση σε C: Παράδειγµα 23∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά Μεταγλωττίστε και εκτελέστε το project circular_queue.dev στο οποίο: Το queue.h έχει τα πρωτότυπα των συναρτήσεων και την δήλωση της δοµής Το queue.c έχει τα σώµατα των συναρτήσεων Το main.c έχει ένα πρόγραµµα που επιδεικνύει την χρήση µίας ουράς ακεραίων. «Παίξτε» µε το πρόγραµµα ώστε να γίνει πλήρως κατανοητή η λειτουργία της ουράς.
  24. 24. Β. Ασκήσεις Εφαρµογή 1: Ταµεία Τράπεζας ∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά 24 Κατασκευάστε ένα πρόγραµµα το οποίο θα προσοµοιώνει τη λειτουργία µιας τράπεζας µε δύο ταµεία Κάθε ταµείο (από τα δύο) θα είναι µια ουρά συµβολοσειρών 80 χαρακτήρων. Κάθε ουρά θα χωράει το πολύ 5 πελάτες. Στην συµβολοσειρά θα αποθηκεύεται το επώνυµο του πελάτη. Το κυρίως πρόγραµµα θα υλοποιεί τις εξής ενέργειες (µέσα από ένα µενού επιλογών): Άφιξη Πελάτη. Θα διαβάζεται από την είσοδο το επώνυµο του πελάτη και έπειτα: Αν «χωράει» στην πρώτη ουρά, τότε θα τοποθετείται σε αυτήν, αλλιώς θα τοποθετείται στην δεύτερη ουρά. Αν δεν χωράει σε καµία ουρά, τότε ο πελάτης δεν θα γίνεται δεκτός. Αναχώρηση Πελάτη. Θα επιλέγεται τυχαία ένα ταµείο που έχει πελάτη και θα αποµακρύνεται ο 1ος πελάτης του ταµείου. Στην οθόνη θα τυπώνεται το επώνυµό του και το ταµείο από το οποίο εξυπηρετήθηκε. Τέλος Προγράµµατος. Θα γίνεται εφικτή, µόνο αν και τα δύο ταµεία είναι άδεια. Σε αντίθετη περίπτωση θα βγάζει µήνυµα για το ποια ταµεία έχουν ακόµη πελάτη. Υπόδειξη: • ∆εδοµένου ότι η κυκλική ουρά είναι «πιο γρήγορη» συνίσταται χρησιµοποιήσετε αυτή, αντί για την απλή ουρά.
  25. 25. Β. Ασκήσεις Εφαρµογή 2: Ουρά Προτεραιότητας ∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά 25 Η ουρά προτεραιότητας είναι µία δοµή δεδοµένων, όπου κάθε στοιχείο που πρόκειται να εισαχθεί στην ουρά έχει και έναν πρόσθετο ακέραιο αριθµό που καθορίζει την προτεραιότητά του (όσο µεγαλύτερη η τιµή του αριθµού, τόσο µεγαλύτερη και η προτεραιότητα). Ένας τρόπος για να υλοποιήσουµε την δοµή δεδοµένων «Ουρά Προτεραιότητας» είναι: Να τοποθετήσουµε έναν ακόµη ακέραιο αριθµό στο στοιχείο της δοµής που καθορίζει την προτεραιότητα. Η εισαγωγή του στοιχείου να γίνεται στην σωστή θέση της ουράς (µε βάση την προτεραιότητα) Κατασκευάστε ένα πρόγραµµα επίδειξης της λειτουργίας της ουράς προτεραιότητας, τροποποιώντας κατάλληλα το project που κατασκευάσαµε για την κυκλική ουρά. Υπόδειξη: • ∆εδοµένου ότι η κυκλική ουρά είναι «πιο γρήγορη» συνίσταται χρησιµοποιήσετε αυτή, αντί για την απλή ουρά.
  26. 26. Β. Ασκήσεις Εφαρµογή 3: Εκτύπωση Στοιχείων Ουράς ∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά 26 Θεωρείστε την κυκλική ουρά ακεραίων που κατασκευάσαµε στο µάθηµα. Θέλουµε να κατασκευάσουµε την δευτερεύουσα πράξη H οποία θα τυπώνει τα στοιχεία της ουράς. Επεκτείνετε το project που κατασκευάσαµε για την κυκλική ουρά ώστε να ενσωµατώνει και αυτήν τη συνάρτηση. Η συνάρτηση αυτή πρέπει να δηλωθεί στην main, καθώς θεωρείται δευτερεύουσα πράξη. Προσοχή όµως! Η συνάρτηση αυτή θεωρείται δευτερεύουσα οπότε ∆ΕΝ πρέπει να έχει πρόσβαση στα µέλη της δοµής. Υπόδειξη: Μπορείτε όµως να ορίσετε βοηθητικές δοµές (όπως π.χ. µία προσωρινή ουρά) Στο κυρίως πρόγραµµα και συγκεκριµένα, στην επιλογή για την εκτύπωση της ουράς, να καλείται αυτή η συνάρτηση. void QU_print(QUEUE *q)
  27. 27. Β. Ασκήσεις Εφαρµογή 4: Αντιστροφή Ουράς ∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 3: Ουρά 27 Επεκτείνετε το project της εφαρµογής 3, έτσι ώστε να ορίζεται και η εξής δευτερεύουσα πράξη στις δηλώσεις της ουράς: Η συνάρτηση αυτή θα αντιστρέφει τα στοιχεία της ουράς (το πρώτο στοιχείο να γίνεται τελευταίο, το δεύτερο προτελευταίο, κ.οκ.) Συνίσταται να χρησιµοποιήσετε µία στοίβα! void QU_reverse(QUEUE *q)

×