Chapitre 1 : piles et queues Daniel Massart 20 août 2014
Definition Une pile est une structure de données à laquelle on n accède que par le dernier élément entré (de manière conventionnelle, on dira "par le haut"), contrairement aux listes, dans lesquelles vous avez un accès direct à n importe quel élément, par la commande L[i].
Definition Une pile est une structure de données à laquelle on n accède que par le dernier élément entré (de manière conventionnelle, on dira "par le haut"), contrairement aux listes, dans lesquelles vous avez un accès direct à n importe quel élément, par la commande L[i]. Exemple une pile d assiettes (d où le nom) : vous n allez pas vous amuser à prendre une assiette au milieu de la pile! Vu comme ça, une liste peut être représentée par des assiettes en position verticale dans le lave-vaisselle : on peut prendre n importe quelle assiette.
une gare à une seule entrée (toutes les gares parisiennes par ex.) : le premier train qui sort est le dernier entré (en anglais "last in, first out", en abrégé LIFO) l historique de votre navigation sur internet (vous n avez que la touche "retour à la page précédente", vous ne pouvez pas demander au navigateur "dis-moi Génie, quelle est la première page que j ai visitée aujourd hui?")
En pratique nous modéliserons les piles par des listes, en ne nous autorisant que les opérations suivantes (que nous appellerons fonctions de bases sur les piles) : créer une pile vide, en Python : def creer-pile() : return [] rajouter un élément sur la pile def empiler(p,e) : p.insert(0,e) regarder l élément qu on vient de rajouter (le sommet de la pile) : def sommet(p) : return p[0] prendre l assiette sur le haut de la pile : def depiler(p) : del p[0 :1]
Enfin deux autres fonctions utiles : pour tester si une pile est vide (afin de ne pas dépiler une pile déjà vide-on aurait aussi pu rajouter un test dans la fonction dépiler) : def est-vide() : return len(p)==0 pour afficher le contenu de la pile (le chef de gare est soigneux, il a pris soin de noter les trains entrant) :
Vous allez me dire "mais c est complètement débile : on a une structure de données puissante (les listes), et on fait exprès de ne pas utiliser toutes ses possibilités!". Oui, mais une structure puissante coûte cher (en place mémoire, temps de calcul, salaire de l ingénieur informaticien...). Si vous représentez la compagnie des chemins de fer dans un pays idéal, vous voulez utiliser au mieux l argent public, et vous faites appel à un informaticien pour gérer les flux dans une gare LIFO : vous allez lui demander de n implémenter que les fonctions que vous utiliserez effectivement, de la façon la plus économique en place mémoire et temps de calcul.
Vous allez me dire "mais c est complètement débile : on a une structure de données puissante (les listes), et on fait exprès de ne pas utiliser toutes ses possibilités!". Oui, mais une structure puissante coûte cher (en place mémoire, temps de calcul, salaire de l ingénieur informaticien...). Si vous représentez la compagnie des chemins de fer dans un pays idéal, vous voulez utiliser au mieux l argent public, et vous faites appel à un informaticien pour gérer les flux dans une gare LIFO : vous allez lui demander de n implémenter que les fonctions que vous utiliserez effectivement, de la façon la plus économique en place mémoire et temps de calcul. Et maintenant, au travail.
Exercice Rappel de la règle du jeu : on n utilise que les fonctions de base! 1. Construire une fonction inverser-pile(p) qui prend en argument une pile p et retourne une autre pile dont les éléments sont ceux de p dans l ordre inverse, p n étant pas modifiée. Evaluer le coût en mémoire et le nombre d opérations de votre procédure. 2. Ecrire une fonction copier-pile(p) qui prend en argument une pile p et retourne une copie de p, sans modifier p. Evaluer le coût en mémoire et le nombre d opérations de votre procédure.
Exercice Construire les fonctions suivantes à l aide des fonctions de base : 1. une fonction "prendre des chemises pour toute la semaine", ou depilerk(p,k) qui enlève k éléments si la pile en contient au moins k, et qui vide la pile, sinon. 2. une fonction depilerjusque(p,e) (ou encore "où est ma chemise grise?") qui enlève des éléments jusqu à ce qu on rencontre l élément e, ou que la pile soit vide. 3. une fonction "non pas celle là", ou permutation 2 (p), qui permute le sommet et le terme suivant de p. 4. (plus difficile) une fonction "pas celle-là non plus" ou permutation circulaire(p, k) qui réalise une permutation circulaire sur les k premiers éléments de la pile. Préciser son coût en mémoire et en nombre d opérations.
Exercice Ecrire un programme qui prend en argument parenthésée, la parcourt de gauche à droite, et renvoie True si le parenthésage est correct, False sinon.
Exercice Ecrire un programme qui prend en argument parenthésée, la parcourt de gauche à droite, et renvoie True si le parenthésage est correct, False sinon. Quel est le rapport avec les piles? l idée est de créer une pile vide, ensuite en parcourant l expression, à chaque fois qu on rencontre une parenthèse ouvrante, on l empile, à chaque fois qu on rencontre une parenthèse fermante, on dépile la dernière ouvrante rencontrée. Le parenthésage est correct si à la fin on se retrouve avec une pile vide.
Definition Une file d attente, ou queue, est une structure de données à laquelle on ne peut que rajouter un élément à la fin, et enlever un élément au début.
Definition Une file d attente, ou queue, est une structure de données à laquelle on ne peut que rajouter un élément à la fin, et enlever un élément au début. Exemple une file d attente n importe où une (hypothétique) gare à deux entrées mais où les trains circulent dans un seul sens : le premier train qui sort est le premier entré (en anglais "first in, first out", en abrégé FIFO).
Exercice Ecrire les fonctions élémentaire de la structure file : 1. une fonction qui crée une file vide 2. une fonction qui teste la vacuité d une file 3. une fonction qui rajoute un élément en dernière position 4. une fonction qui retourne le premier élément et l enlève de la file 5. une fonction qui donne la longueur de la file.
Exercice Ecrire une fonction permutationcirculaire(q,n) qui modifie la file q de telle sorte que l élément en position i se retrouve en position i + n (c est à dire que le premier se retrouve en position n + 1, si n est plus petit que la longueur de q, le deuxième en position n + 2,... et le dernier en position n).