Queues-Files
Implementation Statique et Dynamique
USEK
Faculté
d'Ingénierie
GIN231 - 201120
Les Files - Définition
• Le premier élément inséré dans une file est donc le
pre...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
Les Files - Définition
• Une file est une structure de données linéaire pour
laq...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
Opérations sur les files
• Les opérations de base sur les files sont au nombre d...
Queues 6
Queue Example
Operation Output Q
enqueue(5) – (5)
enqueue(3) – (5, 3)
dequeue() 5 (3)
enqueue(7) – (3, 7)
dequeue...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
Implantation de la structure file
• En général, les langages de programmation n’...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
Implémentation
Implémentation du TDA file
basée sur un tableau statique
• file d...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
Implémentation du TDA file
basée sur un tableau statique
• Problème de tassement...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
Implémentation du TDA file
basée sur un tableau statique
• Solution : décalage
–...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
11
Tableau Circulaire-Circular arrays
• Nous pouvons traiter le tableau contenan...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
Représentation de la file d'attente circulaire
10
0
2
4
1
3
f, r
(a)
10
0
2
4
1
...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
13
Représentation de la file d'attente
circulaire(suite…)
f
r
0
2
4
1
3 30
40
50...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
Changement de la file avec un tableau circulaire
USEK
Faculté
d'Ingénierie
GIN231 - 201120
Implémentation du TDA file
basée sur un tableau statique
• Pour implémenter une ...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
Implémentation du TDA file
basée sur un tableau statique
• L’enroulement circula...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
Implémentation du TDA file
basée sur un tableau statique
• Le seul problème que ...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
18
Files d'attente pleines et vides
• Si la file d'attente étaient de devenir co...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
Full and empty queues: solutions
• Solution #1: Gardez une variable supplémentai...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
6-20
Implementation de la file avec
Tableau Circulaire
rear
front
5
queue
count
...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
Une file d'attente cheval sur la fin
d'un tableau circulaire
rear
front
4
queue
...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
6-22
Queue linéairement circulaire
rear
front
4
queue
count
2
98
0 4321 96 97 98...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
Implementation Tableau Circulaire
• Quand un élément est ajoute dans une file, l...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
Exemple: tableau de longueur 4
Qu'arrive-t-il?
rear
front
3
queue
count
1
2
0 32...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
6-25
Ajouter une autre cellule !
Besoin d’augmenter la taille …
rear
front
4
que...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
rear
front
4
queue
count
6
2
0 321 4 765
Nous pourrions construire le nouveau ta...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
rear
front
4
queue
count
4
0
0 321 4 765
Mieux: copier les éléments de la file d...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
rear
front
5
queue
count
5
0
0 321 4 765
nouvel élément est ajouté à rear = (rea...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
Queues
Array-based Queue
• Use an array of size N in a circular fashion
• Two va...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
Queues 30
Queue Operations
• We use the modulo
operator
(remainder of
division)
...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
Queues 31
Queue Operations (cont.)
static enqueue(int o)
if size() = N - 1
throw...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
Queues
Queue Operations (cont.)
• Operation dequeue
throws an exception if
the q...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
Implementation
• Une file d'attente utilise un tableau circulaire.
Brièvement, u...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
Implementation (Cont’)
• public void enqueue( Object o )
{
if( size == MAX_SIZE ...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
Implementation (Cont’)
• public Object dequeue()
{
if( size == 0 )
throw new NoS...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
Implantation de la TDA file basée sur
les listes chaînées
• L’implantation des f...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
Implantation de la TDA file basée sur
une liste simplement chaînée
• Nous allons...
File avec une Liste-Linked Queue
Implementation Dynamique (Reference-based)
Chaque element a 2 champs: value et next
Creer...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
Implementation d'une file d'attente
avec une Liste Chaineé
count
4
rear
front
.
...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
La File Apres Ajout d’un Element
count
5
rear
front
.
Nouvel élément est ajouté ...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
TDA file - Code
public class Queue {
int size
class Element {
int data; // ELEME...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
TDA file - Code
public boolean isEmpty() {
return queue == null;}
public int siz...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
TDA file - Code
public Object remove() {
if (isEmpty())
System.exit(0);
Object x...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
Implantation de la TDA file basée sur
une liste simplement chaînée circulaire
• ...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
Implantation de la TDA file basée sur
une liste simplement chaînée circulaire
• ...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
Implantation de la TDA file basée sur
une liste simplement chaînée circulaire
• ...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
Implantation de la TDA file basée sur
une liste simplement chaînée circulaire
• ...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
Queue-File: Implémentation Liste
chainée Circulaire
• implementations possible d...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
Queue-File: Implémentation Liste chainée
Circulaire
Insertion d’un element dans ...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
Queue-File: Implémentation Liste
chainée Circulaire
Insertion d’un element dans ...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
Queue: Implementation Liste
chainee Circulaire
Effacer un element de la file
Rea...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
TDA file - Code
public class Queue {
class Element {
int data; // ELEMENT'S DATA...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
TDA file - Code
public boolean isEmpty() {
return queue == null;}
public int siz...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
TDA file - Code
public void remove() {
if (isEmpty())
System.exit(0);
// si la f...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
Queue Example
public Queue<String> findMatches (Scanner input,
String target)
{
...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
Exercices
• Consulter les classes relatives aux files dans le package java.util....
USEK
Faculté
d'Ingénierie
GIN231 - 201120
Application
• Vérification de Palindromes :
– Nous introduisons les caractères d...
USEK
Faculté
d'Ingénierie
GIN231 - 201120
Queues 58
Application: Round Robin Schedulers
• We can implement a round robin s...
java
Prochain SlideShare
Chargement dans…5
×

java

404 vues

Publié le

0 commentaire
0 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

Aucun téléchargement
Vues
Nombre de vues
404
Sur SlideShare
0
Issues des intégrations
0
Intégrations
4
Actions
Partages
0
Téléchargements
10
Commentaires
0
J’aime
0
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive
  • Queue() and isEmpty() is self explanatory. Rear is initialized to –1. Front initialized to 0. Size = 0. Q = new Object[MAX_SIZE].
  • java

    1. 1. Queues-Files Implementation Statique et Dynamique
    2. 2. USEK Faculté d'Ingénierie GIN231 - 201120 Les Files - Définition • Le premier élément inséré dans une file est donc le premier élément sorti : Nous disons que la file a un comportement FIFO : First In First Out. Par ailleurs, la valeur d'une file est par convention celle de l'élément de tête. • Le comportement FIFO permet de modéliser et de gérer des ensembles d'objets qui sont en attente d'un traitement ultérieur, en particulier les files d'attente. – Par exemple, la file d’attente à un guichet de cinéma : Les gens entrent dans la file à la queue et ils sortent de la file dès qu’ils sont en tête.
    3. 3. USEK Faculté d'Ingénierie GIN231 - 201120 Les Files - Définition • Une file est une structure de données linéaire pour laquelle les insertions d’éléments se font toutes d’un même côté, appelé queue de file, et les suppressions se font de l’autre côté, appelé tête de file. En anglais, une file se dit queue. 6 3 5 2 7 1 4Enfilement   Défilement Tête de fileQueue de file
    4. 4. USEK Faculté d'Ingénierie GIN231 - 201120 Opérations sur les files • Les opérations de base sur les files sont au nombre de cinq. – Créer une file vide. Queue() – Déterminer si la file est vide (opération isEmpty) boolean isEmpty() – Enfiler un élément : Ajouter un nouvel élément en queue de la file (opération add). void enqueue( Object o ) – Défiler un élément : Supprimer l’élément en tête de la file (opération remove). Object dequeue() – Renvoyer la valeur de l’élément qui se trouve en tête de la file (opération queueFront) • Notons qu'il n’y a aucune limite théorique au nombre d’éléments d'une file et qu'il est interdit de défiler ou de demander la valeur d’une file vide.
    5. 5. Queues 6 Queue Example Operation Output Q enqueue(5) – (5) enqueue(3) – (5, 3) dequeue() 5 (3) enqueue(7) – (3, 7) dequeue() 3 (7) front() 7 (7) dequeue() 7 () dequeue() “error” () 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)
    6. 6. USEK Faculté d'Ingénierie GIN231 - 201120 Implantation de la structure file • En général, les langages de programmation n’ont pas d’implantation directe de files. Il faut donc en faire une implantation logicielle en utilisant les structures de données primitives offertes par le langage cible. • Il existe plusieurs façons pour implanter une structure de file, nous allons en considérer deux : – la représentation contiguë (ou représentation par un tableau). – la représentation chaînée (ou par une liste chaînée).
    7. 7. USEK Faculté d'Ingénierie GIN231 - 201120 Implémentation Implémentation du TDA file basée sur un tableau statique • file d'entiers  tableau d'entiers. • Taille maximale de la file = Taille du tableau = 10 • Profondeur de la file = Nombre d'éléments effectifs dans le tableau = 5 • Indice de la tête de la file = 0 • Indice de la queue de la file = 4 • Nombre d'éléments effectifs = indice de queue – indice de tête + 1 = 5  Enfilement  Défilement
    8. 8. USEK Faculté d'Ingénierie GIN231 - 201120 Implémentation du TDA file basée sur un tableau statique • Problème de tassement : – Malgré la simplicité de l'implémentation précédente, son utilisation conduit à un problème connu sous le nom de tassement vers la droite. En effet, l'incrémentation de l'index de début (front) à chaque défilement, conduit à la "perte" d'une case du tableau. Après un certain nombre de défilements, la file semble être pleine alors qu'elle est vide.
    9. 9. USEK Faculté d'Ingénierie GIN231 - 201120 Implémentation du TDA file basée sur un tableau statique • Solution : décalage – Cette solution résout notre problème mais au prix fort. En effet, l'opération de défilement ne se fait plus en un temps constant mais en temps linéaire. • Une autre solution consiste à conférer au tableau un comportement circulaire.
    10. 10. USEK Faculté d'Ingénierie GIN231 - 201120 11 Tableau Circulaire-Circular arrays • Nous pouvons traiter le tableau contenant les éléments la file d'attente comme circulaire (joints aux extrémités) 44 55 11 22 33 0 1 2 3 4 5 6 7 myQueue: rear = 1 front = 5 • Des éléments ont été ajoutés à cette file d'attente dans l'ordre 11, 22, 33, 44, 55, et sera supprimée dans le même ordre • Use: front = (front + 1) % myQueue.length; and: rear = (rear + 1) % myQueue.length;
    11. 11. USEK Faculté d'Ingénierie GIN231 - 201120 Représentation de la file d'attente circulaire 10 0 2 4 1 3 f, r (a) 10 0 2 4 1 3 20 30 f r (b) Après insertion 20 & 30 10 0 2 4 1 3 20 30 f r 40 50 Après insertion 40 & 50 (c) 10 f 20 30 r 40 50 0 1 2 3 4 10 f 20 30 r 10 f r 0 1 2 3 4 0 1 2 3 4
    12. 12. USEK Faculté d'Ingénierie GIN231 - 201120 13 Représentation de la file d'attente circulaire(suite…) f r 0 2 4 1 3 30 40 50 (d) Après defilement 10 & 20 f r 0 2 4 1 3 30 40 50 60 (e) Après enfilement 60 f 30 r 40 50 0 1 2 3 4 f 30 r 40 5060 0 1 2 3 4
    13. 13. USEK Faculté d'Ingénierie GIN231 - 201120 Changement de la file avec un tableau circulaire
    14. 14. USEK Faculté d'Ingénierie GIN231 - 201120 Implémentation du TDA file basée sur un tableau statique • Pour implémenter une file par un tableau circulaire nous devons respecter ce qui suit: – on incrémente l’indice front de la file à chaque suppression on incrémente l’indice rear de la file à chaque insertion . – Si l’un ou l’autre index atteint la dernière case, on retombe sur la position 0 au prochain décalage.
    15. 15. USEK Faculté d'Ingénierie GIN231 - 201120 Implémentation du TDA file basée sur un tableau statique • L’enroulement circulaire est obtenu grâce à l'utilistion de la fonction modulo (%) à l’incrémentation de front et de rear.
    16. 16. USEK Faculté d'Ingénierie GIN231 - 201120 Implémentation du TDA file basée sur un tableau statique • Le seul problème que nous avons avec cette stratégie est de déterminer si la file est vide et si la file est pleine. • Dans certain cas, cela n'est pas évident. En effet, dans les 2 situations suivantes nous avons : Rear < Front ; ce qui signifie que la pile est vide ! • Solution : Ajouter un attribut length qui a comme rôle de stocker le nombre d’éléments de la file.
    17. 17. USEK Faculté d'Ingénierie GIN231 - 201120 18 Files d'attente pleines et vides • Si la file d'attente étaient de devenir complètement plein, il devrait ressembler à ceci : • Si nous étions alors de supprimer tous les huit éléments, faisant la file d'attente complètement vide, il devrait ressembler à ceci: 44 55 66 77 88 11 22 33 0 1 2 3 4 5 6 7 myQueue: rear = 4 front = 5 0 1 2 3 4 5 6 7 myQueue: rear = 4 front = 5 This is a problem!
    18. 18. USEK Faculté d'Ingénierie GIN231 - 201120 Full and empty queues: solutions • Solution #1: Gardez une variable supplémentaire • Solution #2 (Un peu plus efficace) Garder un écart entre les éléments: considérons la file d'attente pleine quand elle a n-1 éléments 44 55 66 77 88 11 22 33 0 1 2 3 4 5 6 7 myQueue: rear = 4 front = 5count = 8 44 55 66 77 11 22 33 0 1 2 3 4 5 6 7 myQueue: rear = 3 front = 5
    19. 19. USEK Faculté d'Ingénierie GIN231 - 201120 6-20 Implementation de la file avec Tableau Circulaire rear front 5 queue count 8 3 0 1 2 3 4 5 6 7 8 9 10 n-1 n-2 n-3 . .. cq
    20. 20. USEK Faculté d'Ingénierie GIN231 - 201120 Une file d'attente cheval sur la fin d'un tableau circulaire rear front 4 queue count 2 98 0 1 2 3 4 5 6 7 8 9 10 99 98 97 . .. cq
    21. 21. USEK Faculté d'Ingénierie GIN231 - 201120 6-22 Queue linéairement circulaire rear front 4 queue count 2 98 0 4321 96 97 98 99 … Queue from previous slide cq
    22. 22. USEK Faculté d'Ingénierie GIN231 - 201120 Implementation Tableau Circulaire • Quand un élément est ajoute dans une file, la valeur de rear est incrémenté Mais il faut prendre en compte la nécessité de la boucle arrière à l'indice 0: rear = (rear+1) % queue.length; • Est-ce la mise en œuvre éventail aussi atteindre la capacité du tableau?
    23. 23. USEK Faculté d'Ingénierie GIN231 - 201120 Exemple: tableau de longueur 4 Qu'arrive-t-il? rear front 3 queue count 1 2 0 321 rear front 4 queue count 2 2 0 321 Supposons que nous essayons d'ajouter un élément à une file d'attente mis en œuvre par un tableau de longueur 4 cq cq La file d'attente est maintenant complète. Comment pouvez-vous dire?
    24. 24. USEK Faculté d'Ingénierie GIN231 - 201120 6-25 Ajouter une autre cellule ! Besoin d’augmenter la taille … rear front 4 queue count 2 2 0 321 rear front 4 queue count 2 2 0 321 4 765 Nous ne pouvons pas simplement doubler la taille du tableau: propriétés de la file d'attente circulaire seront perdus Ces emplacements devraient être en service cq cq
    25. 25. USEK Faculté d'Ingénierie GIN231 - 201120 rear front 4 queue count 6 2 0 321 4 765 Nous pourrions construire le nouveau tableau, et de copier les éléments de la file d'attente dans des endroits contigus à partir de l'emplacement front: cq
    26. 26. USEK Faculté d'Ingénierie GIN231 - 201120 rear front 4 queue count 4 0 0 321 4 765 Mieux: copier les éléments de la file d'attente pour le début du nouveau tableau cq
    27. 27. USEK Faculté d'Ingénierie GIN231 - 201120 rear front 5 queue count 5 0 0 321 4 765 nouvel élément est ajouté à rear = (rear+1) % queue.length voir expandCapacity() dans l'élément est ajouté à CircularArrayQueue.java cq
    28. 28. USEK Faculté d'Ingénierie GIN231 - 201120 Queues Array-based Queue • Use an array of size N in a circular fashion • Two variables keep track of the front and rear f index of the front element r index immediately past the rear element • Array location r is kept empty Q 0 1 2 rf normal configuration Q 0 1 2 fr wrapped-around configuration
    29. 29. USEK Faculté d'Ingénierie GIN231 - 201120 Queues 30 Queue Operations • We use the modulo operator (remainder of division) Static int size() return (N - f + r) % N Static boolean isEmpty() return (f == r) Q 0 1 2 rf Q 0 1 2 fr
    30. 30. USEK Faculté d'Ingénierie GIN231 - 201120 Queues 31 Queue Operations (cont.) static enqueue(int o) if size() = N - 1 throw FullQueueException else Q[r]  o r  (r + 1) % N • Operation enqueue throws an exception if the array is full • This exception is implementation- dependent Q 0 1 2 rf Q 0 1 2 fr
    31. 31. USEK Faculté d'Ingénierie GIN231 - 201120 Queues Queue Operations (cont.) • Operation dequeue throws an exception if the queue is empty • This exception is specified in the queue ADT Static int dequeue() if isEmpty() throw EmptyQueueException else o  Q[f] f  (f + 1) % N return o Q 0 1 2 rf Q 0 1 2 fr
    32. 32. USEK Faculté d'Ingénierie GIN231 - 201120 Implementation • Une file d'attente utilise un tableau circulaire. Brièvement, un tableau circulaire est créée avec une variable d'indice qui s'incrémente comme suit: : • I = (I+1) % MAX_SIZE • Les variables Instance de la Classe sont: – private int front – private int rear – private size – private final int MAX_SIZE – private Object[] q
    33. 33. USEK Faculté d'Ingénierie GIN231 - 201120 Implementation (Cont’) • public void enqueue( Object o ) { if( size == MAX_SIZE ) throw new NoSuchElementException(); rear = (rear + 1) % MAX_SIZE; q[rear] = o; size++; } • Runtime analysis: O(1)
    34. 34. USEK Faculté d'Ingénierie GIN231 - 201120 Implementation (Cont’) • public Object dequeue() { if( size == 0 ) throw new NoSuchElementException(); Object hold = q[front]; front = (front + 1) % MAX_SIZE; size--; return hold; } • Runtime Analysis: O(1)
    35. 35. USEK Faculté d'Ingénierie GIN231 - 201120 Implantation de la TDA file basée sur les listes chaînées • L’implantation des files basée sur les listes chaînées est appropriée pour les applications où la taille de la file n'est pas fixée à l'avance. • Nous allons considérer deux implantations : – la première basée sur une liste simplement chaîné, – la deuxième basée sur une liste circulaire.
    36. 36. USEK Faculté d'Ingénierie GIN231 - 201120 Implantation de la TDA file basée sur une liste simplement chaînée • Nous allons utiliser une liste simplement chaînée et deux références front et rear qui représente respectivement la tête et la queue de la file. • Dans cette implémentation, l'enfilement d'un nouvel élément se fait après l'élément référencé par rear tandis que le défilement se fait par la suppression de l'élément référencé par front. • La file est vide quand rear et front ont tous les deux la valeur null. front rear
    37. 37. File avec une Liste-Linked Queue Implementation Dynamique (Reference-based) Chaque element a 2 champs: value et next Creer et effacer des objets Dynamiquement 2 next 7 next Front 4 next 5 next null Rear
    38. 38. USEK Faculté d'Ingénierie GIN231 - 201120 Implementation d'une file d'attente avec une Liste Chaineé count 4 rear front . Une file q contient quatre elements q
    39. 39. USEK Faculté d'Ingénierie GIN231 - 201120 La File Apres Ajout d’un Element count 5 rear front . Nouvel élément est ajouté dans un noeud à la fin de la liste, rear point vers le nouveau nœud, et count est incremente q
    40. 40. USEK Faculté d'Ingénierie GIN231 - 201120 TDA file - Code public class Queue { int size class Element { int data; // ELEMENT'S DATA Element next; // REFERENCE TO THE NEXT ELEMENT Element(int value) { data = value; next = this; } } private Element rear = null; // queue (fin) de file private Element front = null; // queue (fin) de file public Queue() { rear = null; }
    41. 41. USEK Faculté d'Ingénierie GIN231 - 201120 TDA file - Code public boolean isEmpty() { return queue == null;} public int size() { return size;} public void add(int value) { Element tmp; tmp = new Element(value); if (!isEmpty()){ // si la file n'est pas vide rear.next = tmp; rear = tmp; } }
    42. 42. USEK Faculté d'Ingénierie GIN231 - 201120 TDA file - Code public Object remove() { if (isEmpty()) System.exit(0); Object x= front.data; // si la file contient un élément if (front.next == rear) rear = null; else front = front.next.next; } return x; } public int queueFront() { if (isEmpty()) System.exit(0); return rear.next.data; } }
    43. 43. USEK Faculté d'Ingénierie GIN231 - 201120 Implantation de la TDA file basée sur une liste simplement chaînée circulaire • L'utilisation d'une liste circulaire permet de faire l'économie d'une référence. • Dans cette implémentation, – la référence queue se réfère à la queue de file. – la référence queue.next se réfère sur la tête de file. – L'enfilement d'un nouvel élément se fait entre queue et queue.next tandis que le défilement se fait par la suppression de l'élément pointé par queue.next. • La file est vide quand queue se réfère à null.
    44. 44. USEK Faculté d'Ingénierie GIN231 - 201120 Implantation de la TDA file basée sur une liste simplement chaînée circulaire • Etapes à suivre pour réaliser un enfilement dans une file vide : – Création d'un nouveau nœud (référencé par tmp sur le schéma). – Initialisation de ce nœud (valeur et lien). – Enfilement par ajustement des liens. queue tmp queue tmp queue tmp
    45. 45. USEK Faculté d'Ingénierie GIN231 - 201120 Implantation de la TDA file basée sur une liste simplement chaînée circulaire • Etapes à suivre pour réaliser un défilement : – La tête de file est le nœud pointé référencé queue.next. – Ajuster les liens. queue queue queue
    46. 46. USEK Faculté d'Ingénierie GIN231 - 201120 Implantation de la TDA file basée sur une liste simplement chaînée circulaire • Etapes à suivre pour réaliser un enfilement dans une file non vide : – Création d'un nouveau nœud (référencé par tmp sur le schéma). – Initialisation de ce nœud (valeur et lien). – Enfilement par insertion de tmp entre queue et queue.next. queue tmp queue tmp queue queue tmp
    47. 47. USEK Faculté d'Ingénierie GIN231 - 201120 Queue-File: Implémentation Liste chainée Circulaire • implementations possible de la file – Une liste chainee circulaire avec une seule reference au dernier element • A reference to the back A reference-based implementation de la file base sur les references: b) Liste circulaire linaire avec une seule reference
    48. 48. USEK Faculté d'Ingénierie GIN231 - 201120 Queue-File: Implémentation Liste chainée Circulaire Insertion d’un element dans une file n’est pas vide t.next=lastNode.next; lastNode.next=newNode; lastNode=newNode;
    49. 49. USEK Faculté d'Ingénierie GIN231 - 201120 Queue-File: Implémentation Liste chainée Circulaire Insertion d’un element dans la file : a) avant insertion; b) apres insertion newNode.next=newNode lastNode=newNode;
    50. 50. USEK Faculté d'Ingénierie GIN231 - 201120 Queue: Implementation Liste chainee Circulaire Effacer un element de la file Rear.next=rear.next.next
    51. 51. USEK Faculté d'Ingénierie GIN231 - 201120 TDA file - Code public class Queue { class Element { int data; // ELEMENT'S DATA Element next; // REFERENCE TO THE NEXT ELEMENT Element(int value) { data = value; next = this; } } private Element queue = null; // queue (fin) de file public Queue() { queue = null; }
    52. 52. USEK Faculté d'Ingénierie GIN231 - 201120 TDA file - Code public boolean isEmpty() { return queue == null;} public int size() { return size;} public void add(int value) { Element tmp; tmp = new Element(value); if (!isEmpty()){ // si la file n'est pas vide tmp.next = queue.next; queue.next = tmp; } queue = tmp; }
    53. 53. USEK Faculté d'Ingénierie GIN231 - 201120 TDA file - Code public void remove() { if (isEmpty()) System.exit(0); // si la file contient un élément if (queue.next == queue) queue = null; else queue.next = queue.next.next; } public int queueFront() { if (isEmpty()) System.exit(0); return queue.next.data; } }
    54. 54. USEK Faculté d'Ingénierie GIN231 - 201120 Queue Example public Queue<String> findMatches (Scanner input, String target) { Queue<String> q = new LinkedList<String>(); while (input.hasNextLine ()) { String line = input.nextLine (); if (line.indexOf (target) >= 0 ) q.add (line); } return q; } Returns a queue of all the lines that contain target public void process (Queue<String> q) { while (! q.isEmpty ()) { String s = q.remove (); ... // process s } } Processes the contents of q (leaves the queue empty)
    55. 55. USEK Faculté d'Ingénierie GIN231 - 201120 Exercices • Consulter les classes relatives aux files dans le package java.util. • Implémenter la TDA file en utilisant un tableau statique "circulaire". • Implémenter la TDA file en utilisant une liste simplement chaînée. • Ajouter aux implémentations de la TDA file les trois opérations de base suivantes : – makeEmpty : supprimer tous les éléments de la file – queueFrontAndRemove : défiler et retourner l'élément défilé – search : retourne la position dans la file d'une valeur reçue en argument. Retourner -1 si la valeur n'existe pas dans la file. • Implémenter la TDA file de priorité. Utiliser un attribut de type entier positif pour indiquer la priorité. • Ecrire une méthode qui permet de comparer le contenu d’une pile à celui d’une file. Si les éléments de la pile de son sommet vers sa base, sont les mêmes que ceux de la file de sa tête vers sa queue, alors la méthode retourne la valeur true, sinon elle retourne false.
    56. 56. USEK Faculté d'Ingénierie GIN231 - 201120 Application • Vérification de Palindromes : – Nous introduisons les caractères de la chaîne dans une pile et une file. – Nous comparons le sommet de la pile au sommet de la file. • Si les deux caractères sont égaux, on les supprime et on répète le test jusqu’à ce que les deux structures soient vides. Auquel cas, la chaîne est un palindrome. • Si les deux caractères ne sont pas égaux, la chaîne n’est pas un palindrome.
    57. 57. USEK Faculté d'Ingénierie GIN231 - 201120 Queues 58 Application: Round Robin Schedulers • We can implement a round robin scheduler using a queue, Q, by repeatedly performing the following steps: 1. e = Q.dequeue() 2. Service element e 3. Q.enqueue(e) The Queue Shared Service 1. Deque the next element 3. Enqueue the serviced element 2. Service the next element

    ×