Implémentation et Opérations de Base d'une File Circulaire en C++

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;
}

Étiquettes: file-circulaire cpp structure-de-donnees file-attente allocation-dynamique

Publié le 20 octobre à 20h16