Une file circulaire utilise un tableau de taille fixe où les indices de tête et de queue rebouclent au début du tableau lorsqu'ils atteignent la fin, grâce à l'opération modulo.
- État initial : Les indices de tête et de queue sont positionnés à zéro :
f.start = f.end = 0 - Avancement de la tête :
f.start = (f.start + 1) % MAX_CAPACITY - Avancement de la queue :
f.end = (f.end + 1) % MAX_CAPACITY - Calcul du nombre d'éléments :
(f.end - f.start + MAX_CAPACITY) % MAX_CAPACITY - Condition de file pleine :
(f.end + 1) % MAX_CAPACITY == f.start(On sacrifie volontairement un emplacemant pour distinguer l'état plein de l'état vide). - Condition de file vide :
f.start == f.end
Opérations de Base
1. Initialisation de la file
Allocation de l'espace mémoire nécessaire pour le tableau de stockage et initialisation des pointeurs à zéro.
int InitialiserFile(FileCirculaire& f) {
f.items = new int[MAX_CAPACITY];
if (!f.items) return ERREUR_ALLOCATION;
f.start = f.end = 0;
return SUCCES;
}
2. Destruction de la file
Libération de la mémoire allouée et réinitialisation des pointeurs. Contrairement au simple nettoyage, la file ne peut plus être utilisée après cette opération.
int DetruireFile(FileCirculaire& f) {
delete[] f.items;
f.items = nullptr;
f.start = f.end = 0;
return SUCCES;
}
3. Nettoyage de la file
Réinitialisation logique de la file sans libérer la mémoire sous-jacente. Les données sont simplement écrasées lors des prochains ajouts.
int ViderFile(FileCirculaire& f) {
f.start = f.end = 0;
return SUCCES;
}
4. Vérification de vacuité
La file est considérée comme vide si l'indice de tête rattrape l'indice de queue.
bool EstVide(const FileCirculaire& f) {
return (f.start == f.end);
}
5. Obtention de la longueur
Calcul du nombre d'éléments valides en gérant le chevauchement potentiel de l'indice de queue sur l'indice de tête.
int TailleFile(const FileCirculaire& f) {
return (f.end - f.start + MAX_CAPACITY) % MAX_CAPACITY;
}
6. Accès à l'élément de tête
Récupération de la valeur située à l'indice de tête si la file n'est pas vide.
int PremierElement(const FileCirculaire& f, int& val) {
if (f.start == f.end) return ERREUR;
val = f.items[f.start];
return SUCCES;
}
7. Enfilement (Insertion en queue)
Ajout d'un élément à la position de queue, après vérification que la file n'est pas saturée.
int Enfiler(FileCirculaire& f, const int& val) {
if ((f.end + 1) % MAX_CAPACITY == f.start) return ERREUR_PLEINE;
f.items[f.end] = val;
f.end = (f.end + 1) % MAX_CAPACITY;
return SUCCES;
}
8. Défilement (Suppression en tête)
Retrait de l'élément en tête de file et récupération de sa valeur. L'indice de tête avance circulairement.
int Defiler(FileCirculaire& f, int& val) {
if (f.start == f.end) return ERREUR_VIDE;
val = f.items[f.start];
f.start = (f.start + 1) % MAX_CAPACITY;
return SUCCES;
}
9. Parcours de la file
Itération circulaire depuis l'indice de tête jusqu'à l'indice de queue pour appliquer un traitement (comme l'affichage) sur chaque élément.
int ParcourirFile(const FileCirculaire& f) {
int curseur = f.start;
while (curseur != f.end) {
std::cout << " " << f.items[curseur];
curseur = (curseur + 1) % MAX_CAPACITY;
}
std::cout << std::endl;
return SUCCES;
}