Les opérations sont : entrer dans la file (à la queue, comme tout le monde), sortir de la file (en tête), prendre la valeur de tête, tester si la file est vide.
Comme pour les piles, l'implémentation des files utilise un tableau,
mais cette fois-ci avec deux indices indiquant la tête (head ) et
la queue (tail ). On utilise le tableau de façon circulaire : la
file est vide si les valeurs de head et
de
tail sont égales. Les entrées dans la file se font par la
droite ; une file f non vide a la forme
f.valeur[
] (le prochain sorti), ...,
f.valeur[
] (le dernier entré) ; si
MAX, le prochain élément sera entré dans le tableau à l'indice
0 ; un troisième champ, full, est nécessaire pour
distinguer une file vide d'une file pleine.
typedef struct {
int head, tail, full;
queue_data content[MAX];
} queue;
void mk_empty_queue (queue *q) {
q->head = q->tail = q->full =0;
}
int is_empty_queue(queue *q) {
return (q->head == q->tail) && !q->full;
}
void in(queue_data x, queue *q) {
if (!q->full) {
q->content[q->tail] = x;
q->tail = (q->tail +1) % MAX;
} else {
fprintf(stderr, "file pleine\n");
exit(1);
}
if (q->head == q->tail) {
q->full = 1;
}
}
queue_data head(queue *q) {
if (is_empty_queue (q)) {
fprintf(stderr, "file vide\n");
exit(1);
} else {
return q->content[q->head];
}
}
queue_data out(queue *q) {
if (is_empty_queue(q)) {
fprintf(stderr, "file vide\n");
exit(1);
} else {
int h = q->head;
q->head = (h +1) % MAX;
if (h == q->tail) {
q->full = 0;
}
return q->content[h];
}
}