Voici comment implémenter et appliquer les files d'attente dans JavaScript pour différents scénarios.
1. Attribution des Partenaires de Danse Carrée avec une File d'Attente
Dans ce modèle, les participants masculins et féminins forment deux files distinctes. Lorsqu'une place se libère, le premier de chaque file est apparié. Les noms sont lus à partir d'un fichier texte, puis triés par sexe dans les files correspondantes. Le programme annonce chaque paire formée et signale si l'une des files est vide après la formation des couples.
<script type="text/javascript">
function FileDAttente() {
this.elements = [];
this.ajouter = ajouter;
this.retirer = retirer;
this.premier = premier;
this.dernier = dernier;
this.versString = versString;
this.estVide = estVide;
this.nombre = nombre;
}
function ajouter(element) {
this.elements.push(element);
}
function retirer() {
return this.elements.shift();
}
function premier() {
return this.elements[0];
}
function dernier() {
return this.elements[this.elements.length - 1];
}
function versString() {
let resultat = "";
for (let i = 0; i < this.elements.length; i++) {
resultat += this.elements[i] + "\n";
}
return resultat;
}
function estVide() {
return this.elements.length === 0;
}
function nombre() {
return this.elements.length;
}
function Danseur(nom, genre) {
this.nom = nom;
this.genre = genre;
}
function chargerDanseurs(hommes, femmes) {
const donnees = read("danseurs.txt").split("\n");
for (let ligne of donnees) {
ligne = ligne.trim();
const parties = ligne.split(" ");
const genre = parties[0];
const nom = parties[1];
if (genre === "F") {
femmes.ajouter(new Danseur(nom, genre));
} else {
hommes.ajouter(new Danseur(nom, genre));
}
}
}
function formerCouples(hommes, femmes) {
console.log("Couples de danse :\n");
while (!femmes.estVide() && !hommes.estVide()) {
const partenaireF = femmes.retirer();
console.log("Danseuse : " + partenaireF.nom);
const partenaireH = hommes.retirer();
console.log(" et danseur : " + partenaireH.nom);
}
}
const fileHommes = new FileDAttente();
const fileFemmes = new FileDAttente();
chargerDanseurs(fileHommes, fileFemmes);
formerCouples(fileHommes, fileFemmes);
if (!fileFemmes.estVide()) {
console.log(fileFemmes.premier().nom + " attend pour danser.");
}
if (!fileHommes.estVide()) {
console.log(fileHommes.premier().nom + " attend pour danser.");
}
if (fileHommes.nombre() > 0) {
console.log("Nombre d'hommes en attente : " + fileHommes.nombre());
}
if (fileFemmes.nombre() > 0) {
console.log("Nombre de femmes en attente : " + fileFemmes.nombre());
}
</script>
2. Tri par Base Utilisant des Files d'Attente
Cette technique de tri numériorique effectue deux passes : une pour le chiffre des unités, une pour le chiffre des dizaines. Chaque chiffre est distribué dans une file correspondante (0 à 9), puis collecté pour former une nouvelle séquence. Ce processus est répété pour chaque position de chiffre.
<script type="text/javascript">
function FileDAttente() {
this.elements = [];
this.ajouter = ajouter;
this.retirer = retirer;
this.premier = premier;
this.dernier = dernier;
this.versString = versString;
this.estVide = estVide;
this.nombre = nombre;
}
function ajouter(element) {
this.elements.push(element);
}
function retirer() {
return this.elements.shift();
}
function premier() {
return this.elements[0];
}
function dernier() {
return this.elements[this.elements.length - 1];
}
function versString() {
let resultat = "";
for (let i = 0; i < this.elements.length; i++) {
resultat += this.elements[i] + "\n";
}
return resultat;
}
function estVide() {
return this.elements.length === 0;
}
function nombre() {
return this.elements.length;
}
function repartir(tableau, files, position) {
for (let valeur of tableau) {
let cle;
if (position === 1) {
cle = valeur % 10;
} else {
cle = Math.floor(valeur / 10);
}
files[cle].ajouter(valeur);
}
}
function collecter(files, tableau) {
let index = 0;
for (let i = 0; i < files.length; i++) {
while (!files[i].estVide()) {
tableau[index++] = files[i].retirer();
}
}
}
const files = Array.from({length: 10}, () => new FileDAttente());
const donnees = Array.from({length: 10}, () => Math.floor(Math.random() * 101));
console.log("Avant tri par base :");
console.log(donnees);
repartir(donnees, files, 1);
collecter(files, donnees);
repartir(donnees, files, 10);
collecter(files, donnees);
console.log("Après tri par base :");
console.log(donnees);
</script>
3. File de Priorité pour la Gestion des Patients
Une file de priorité permet de retirer l'élément ayant la priorité la plus haute (code le plus bas). Ici, les pateints sont modélisés avec un nom et un code de priorité. La méthode de retrait parcourt la file pour trouver l'élément avec le code minimal.
<script type="text/javascript">
function FileDePriorite() {
this.elements = [];
this.ajouter = ajouter;
this.retirer = retirer;
this.premier = premier;
this.dernier = dernier;
this.versString = versString;
this.estVide = estVide;
this.nombre = nombre;
}
function ajouter(patient) {
this.elements.push(patient);
}
function retirer() {
let prioriteMin = 0;
for (let i = 1; i < this.elements.length; i++) {
if (this.elements[i].code < this.elements[prioriteMin].code) {
prioriteMin = i;
}
}
return this.elements.splice(prioriteMin, 1)[0];
}
function premier() {
return this.elements[0];
}
function dernier() {
return this.elements[this.elements.length - 1];
}
function versString() {
let resultat = "";
for (let i = 0; i < this.elements.length; i++) {
resultat += this.elements[i].nom + ", priorité: " + this.elements[i].code + "\n";
}
return resultat;
}
function estVide() {
return this.elements.length === 0;
}
function nombre() {
return this.elements.length;
}
function Patient(nom, code) {
this.nom = nom;
this.code = code;
}
const urgence = new FileDePriorite();
urgence.ajouter(new Patient("Smith", 5));
urgence.ajouter(new Patient("Jones", 4));
urgence.ajouter(new Patient("Fehrenbach", 6));
urgence.ajouter(new Patient("Brown", 1));
urgence.ajouter(new Patient("Ingram", 1));
console.log(urgence.versString());
console.log("---");
let patientTraite = urgence.retirer();
console.log("Patient en traitement : " + patientTraite.nom);
console.log("Patients en attente :");
console.log(urgence.versString());
console.log("---");
patientTraite = urgence.retirer();
console.log("Patient en traitement : " + patientTraite.nom);
console.log("Patients en attente :");
console.log(urgence.versString());
console.log("---");
patientTraite = urgence.retirer();
console.log("Patient en traitement : " + patientTraite.nom);
console.log("Patients en attente :");
console.log(urgence.versString());
</script>