You are on page 1of 53

iUT

ORSAY

Universit Paris XI I.U.T. d'Orsay Dpartement Informatique Anne scolaire 2003-2004

Algorithmique : Volume 4
Listes chanes Piles et files

Ccile Balkanski, Nelly Bensimon, Grard Ligozat

Retour au type tableau


Avantages
- Accs direct un lment quelconque du tableau par un indice - Souplesse dans lcriture des algorithmes

- Algorithmes de recherche trs performants quand les lments sont ordonns

Algorithmique 4 : Listes chanes

Retour au type tableau (suite)


Inconvnients
- Ncessit de dfinir la dimension maximale alloue ds la dclaration, c'est dire de faon statique

- Lourdeur dans la gestion optimale de l'espace occup par les donnes

- Ncessit d'effectuer des contrles de dbordement chaque tape du traitement


Algorithmique 4 : Listes chanes 2

Cahier des charges d'une reprsentation moins contrainte


Permettre l'allocation de mmoire en fonction des besoins, de faon dynamique Faciliter la gestion de la mmoire occupe en cas d'insertion ou de suppression de nouvelles donnes Simulation de phnomnes du monde physique mal reprsents par la structure en tableaux Exemples de situations :
File d'attente un guichet Urgences d'un hpital Distribution de cartes une table de joueurs Gestion des dossiers empils sur un bureau
Algorithmique 4 : Listes chanes 3

La notion de liste chane


cellule

donne donne donne

lien

donne
Algorithmique 4 : Listes chanes

donne

Insertion/suppression d'une donne


Cellule insrer en milieu de chane

nouvelle donne
Cellule insrer en fin de chane

donne donne donne nouvelle donne nouvelle donne


cellule retirer

Cellule insrer en dbut de chane

donne
Algorithmique 4 : Listes chanes

donne
5

Reprage des cellules d'une liste chane


Premire ("tte") Prcdente donne donne donne Dernire ("queue") donne Suivante donne
Algorithmique 4 : Listes chanes 6

Courante

Exemples de traitements oprs sur les listes (1)


Traitements relatifs la composition structurelle de la liste :
- Positionnement sur la premire cellule de la structure - Positionnement sur la dernire cellule de la structure - Calcul de la longueur d'une liste (nombre de cellules) - Reconnaissance d'une liste vide - Dplacement du positionnement courant sur la cellule suivante
Algorithmique 4 : Listes chanes 7

Exemples de traitements oprs sur les listes (2)


Traitements relatifs l'information enregistre dans une liste :
- Enregistrement de donnes jusqu' puisement du flot de donnes - Visualisation de l'information enregistre dans une cellule, quelle que soit sa place dans la liste - Visualisation de l'ensemble des informations enregistres dans la liste - Suppression d'une cellule; ajout dune cellule
Algorithmique 4 : Listes chanes 8

Cahier des charges pour une classe Liste

Les attributs de la classe Liste doivent


permettre:
le positionnement sur les diffrentes cellules de la liste la dfinition du type d'information enregistre dans la cellule

Les mthodes de la classe doivent permettre


tous les traitements dcrits prcdemment (et plus...)
Algorithmique 4 : Listes chanes 9

Dfinition de la classe Liste


classe Liste
Attributs : tte : rfrence {rfrence la cellule tte de liste} curseur : rfrence {rfrence la cellule courante} rfrence : type dont le domaine de dfinition est l'ensemble des adresses
mmoire. - Valeur de lattribut tte (attribut curseur) : adresse de la case mmoire o est stocke la cellule de tte de liste (cellule courante) - Reprsentation graphique : une flche listeA
cellule

tte curseur
cellule
Algorithmique 4 : Listes chanes 10

Dfinition d'une cellule


type Cellule = agrgat
val : Info {information stocke dans une cellule} suivant : rfrence {rfrence une autre cellule} fin
Info : le type de l'information stocke; peut-tre un type de base (par exemple, un entier) ou bien un type complexe (un agrgat)

Reprsentation graphique des cellules : val1 val2 val3

listeA

tte curseur

val4
Algorithmique 4 : Listes chanes 11

Mthodes de la classe Liste


MProcdure suivant() {place le curseur sur la cellule qui suit la cellule courante. Si le curseur tait sur la dernire cellule, il devient hors liste. Erreur si la liste est vide ou si le curseur est dj hors liste.} paramtre (D/R) cible : Liste exemple : liste initiale L1

aprs L1.suivant()

Algorithmique 4 : Listes chanes

12

Mthodes (suite)
MProcdure premier() {place le curseur sur la premire cellule de la liste. Si la liste est vide, le curseur reste hors liste.} paramtre (D/R) cible : Liste

MProcdure dernier() {place le curseur sur la dernire cellule de la liste. Si la liste est vide, le curseur reste hors liste.} paramtre (D/R) cible : Liste

MFonction vide() retourne boolen {retourne vrai si la liste est vide, faux sinon} paramtre (D) cible : Liste
Algorithmique 4 : Listes chanes 13

Mthodes (suite)
MFonction horsListe() retourne boolen {retourne vrai si le curseur est plac hors liste ou si la liste est vide, faux sinon.} paramtre (D) cible : Liste MFonction info() retourne Info {retourne la valeur enregistre dans la cellule courante. Erreur si la liste est vide ou si le curseur est hors liste.} paramtre (D) cible : Liste MProcdure affecter(val) {affecte la valeur val la cellule courante. Erreur si la liste est vide ou si le curseur est hors liste.} paramtres (D/R) cible : Liste (D) val : Info
Algorithmique 4 : Listes chanes 14

Mthodes (suite)
MProcdure insrerAvant(val) {cre une nouvelle cellule, y affecte la valeur val, et l'insre avant la cellule courante. Le curseur est alors plac sur cette nouvelle cellule qui devient ainsi la nouvelle cellule courante. Si le curseur tait plac sur la tte, la nouvelle cellule devient la nouvelle tte. Si la liste tait vide, elle contient maintenant l'unique cellule qui vient d'tre cre. Erreur si la liste tait non vide et le curseur hors liste.} paramtres (D/R) cible : Liste (D) val : Info Remarque : premier() suivi de insrerAvant(val) ajouter en tte
Algorithmique 4 : Listes chanes 15

Insertion dune cellule : insrerAvant


insrerAvant : en milieu de liste
2e donne

cellule courante nouvelle cellule


nouvelle donne

1e donne

3e donne

4e donne

insrerAvant : en dbut de liste nouvelle cellule


nouvelle donne

nouvelle cellule courante cellule courante


1e donne 2e donne

Algorithmique 4 : Listes chanes

16

Mthodes (suite)
MProcdure insrerAprs(val) {cre une nouvelle cellule, y affecte la valeur val, et l'insre aprs la cellule courante. Le curseur est alors plac sur cette nouvelle cellule qui devient ainsi la nouvelle cellule courante. Si liste tait vide, elle contient maintenant l'unique cellule qui vient d'tre cre. Erreur si la liste tait non vide et le curseur hors liste.} paramtres (D/R) cible : Liste (D) val : Info Remarque : dernier() suivi de insrerAprs(val) ajouter en queue

Algorithmique 4 : Listes chanes

17

Insertion dune cellule : insrerAprs


insrerAprs : en milieu de liste
1e donne 2e

cellule courante

nouvelle cellule
nouvelle donne 4e donne

donne

3e

donne

insrerAprs : en fin de liste


1e donne 2e donne 3e donne

nouvelle cellule courante


nouvelle donne

cellule courante
Algorithmique 4 : Listes chanes

nouvelle cellule
18

Mthodes (suite)
MProcdure supprimer() {supprime la cellule courante. Le curseur est alors plac sur la cellule suivante qui devient ainsi la nouvelle cellule courante. Si la cellule supprimer est la dernire cellule, le curseur devient hors liste. Si la cellule supprimer est la tte, la cellule suivante devient alors la nouvelle tte. Si la liste ne contenait qu'une seule cellule, la liste devient vide. Erreur si la liste est vide ou si le curseur est hors liste.} paramtre (D/R) cible : Liste Remarque premier() suivi de supprimer() supprimer en tte dernier() suivi de supprimer() supprimer en queue
Algorithmique 4 : Listes chanes 19

Suppression dune cellule


supprimer : en milieu de liste
1e donne 2e donne 3e donne

cellule courante, supprimer

4e donne

5e donne

supprimer : en fin de liste


1e donne 2e donne

nouvelle cellule courante


4e donne

3e donne

cellule courante, supprimer


Algorithmique 4 : Listes chanes 20

Mthodes (suite et fin)


MProcdure saisirListe()
{Saisit des valeurs (de type Info), jusqu' une valeur d'arrt, et cre au fur et mesure autant de cellules que ncessaire, en y affectant les valeurs saisies. Le curseur est ensuite replac en tte de liste.}

paramtre

(R) cible : Liste

MProcdure afficherListe()
{Affiche toutes les valeurs contenues dans la liste cible.}

paramtre

(D) cible : Liste

MProcdure supprimerTout()
{supprime toutes les cellules de la liste (qui peut tre vide); la liste devient vide et le curseur devient hors liste.}

paramtre

(D/R) cible : Liste


Algorithmique 4 : Listes chanes 21

Remarques importantes
Mthodes de deux types :
- mthodes de base: leur dfinition ncessite de modifier les attributs privs de la classe (sera fait en C++). - saisirListe(), afficherListe(), supprimerTout() : mthodes rajoutes la classe pour rendre son utilisation plus commode; leur dfinition peut se faire laide des mthodes de base.

Rappel : les 3 acteurs de la programmation objet :


- programmeur concepteur de la classe - programmeur utilisateur de la classe - utilisateur de lapplication
Algorithmique 4 : Listes chanes 22

Saisie d'une liste


MProcdure saisirListe()
{Saisit des valeurs (de type Info), jusqu' une valeur d'arrt (constante dfinie dans l'algorithme appelant), et cre au fur et mesure autant de cellules que ncessaire, en y affectant les valeurs saisies. Le curseur est ensuite replac en tte de liste.} paramtre (R) cible : Liste variables uneVal : Info cpt : entier dbut saisir(uneVal) ; cpt 0 tant que uneVal valStop faire cpt cpt + 1 cible.insrerAprs(uneVal) saisir(uneVal) ftq cible.premier() {replace le curseur en tte} afficher(La nouvelle liste contient , cpt, cellules.) fin Algorithmique 4 : Listes chanes 23

Saisie d'une liste : simulation

Algorithmique 4 : Listes chanes

24

Affichage d'une liste


MProcdure afficherListe()
{Affiche toutes les valeurs contenues dans la liste cible.} paramtre (D) cible : Liste variable copieCible : Liste dbut {copie de la cible, copieCible cible
pour permettre modification du curseur}

copieCible.premier() {place le curseur en tte} tant que non copieCible.horsListe() faire {arrt quand curseur hors liste} afficher(copieCible.info()) {rcupre la valeur de la cellule courante et l'affiche} copieCible.suivant() {place le curseur sur la cellule suivante} ftq fin
Algorithmique 4 : Listes chanes 25

Exemple dalgorithme (1)


Algorithme ManipListes1
{Saisie et affichage dune liste.} constante (VALSTOP : entier) variable listeA : Liste dbut listeA.saisirListe() afficher("Liste saisie : ") listeA.afficher() fin 0

Algorithmique 4 : Listes chanes

26

Exemple de fonction utilisant la classe liste (1)


Fonction valMin(uneListe) retourne rel {retourne la plus petite valeur contenue dans une liste de rels suppose non vide} paramtre (D) uneListe : ListeRel

Algorithmique 4 : Listes chanes

27

Exemple de fonction utilisant la classe liste (2)


Fonction inverse(uneListe) retourne Liste {cre une nouvelle liste, en y affectant les valeurs de la liste uneListe mais dans l'ordre inverse. La liste uneListe est suppose non vide} paramtre (D) uneListe : Liste

Algorithmique 4 : Listes chanes

28

Exemple de fonction utilisant la classe liste (3)


Procdure supprimerGlobal(uneVal, uneListe)
{supprime toutes les cellules de la liste uneListe qui contiennent la valeur uneVal. Replace le curseur en tte.}

paramtre

(D/R) uneListe : Liste (D) uneVal : Info

Algorithmique 4 : Listes chanes

29

Exemple dalgorithme (2)


Algorithme ManipListes2 {Exemple dalgorithme manipulant les listes.} constante (VALSTOP : entier) 0 variables listeA, listeB, listeC : Liste dbut listeA.saisir() afficher("listeA: ") listeA.afficher() si non listeA.vide() alors listeB inverse(listeA) afficher("listeB contient les lments de la listeA en ordre inverse : ") listeB.afficher() supprimerGlobal(0, listeA) afficher("ListeA sans zros: ") listeA.afficher() afficher("Plus petite valeur de listeA :" , valMin(listeA) ) fsi Algorithmique 4 : Listes chanes fin

30

Files et Piles
Retour sur la motivation: pourquoi des listes chanes?
Possibilit de crotre ou de diminuer selon les besoins Facilit de rordonnancement des lments
Exemples : - placer le dernier lment en tte : changer trois rfrences (tableau : tout dcaler) - insertion d'un nouvel lment : changer deux rfrences, indpendamment de la longueur de la liste - effacement d'un lment

Mais : mal adaptes d'autres oprations - trouver le k-ime lment : parcours squentiel de k rfrences
(tableau : accs direct lindice k) - trouver l'lment qui prcde un lment donn
Algorithmique 4 : Files et Piles 31

Files et Piles
Dans beaucoup d'applications, on peut se contenter de modes d'accs trs restreints la structure de donnes

Avantages :
le programme n'a pas se proccuper de dtails de gestion (des rfrences, par exemple) traitements plus simples et moins rigides (moins d'oprations)

Algorithmique 4 : Files et Piles

32

Reprsentation d'une file par une liste chane


Alice Julie Anna Pierre Daniel

tte

cible. supprimerEnTte() cible.ajouterEnFin ("Daniel")

queue

- les ajouts se font en fin de file, les suppressions en tte de file - seule linformation de la tte est accessible et traitable file dattente un guichet "premier rentr, premier sorti" (FIFO : first in first out, queue)
Algorithmique 4 : Files et Piles 33

Reprsentation d'une pile par une liste chane


Alice Julie Anna Pierre Daniel

tte

cible.dpiler( ) cible.empiler("Alice")

- les ajouts comme les suppressions se font en tte de pile - seule linformation de la tte est accessible et traitable pile dassiettes "dernier rentr, premier sorti" (LIFO : last in first out, stack)
Algorithmique 4 : Files et Piles 34

la classe File :
les besoins
Attributs :
- la tte et la queue, mais pas de curseur

Mthodes :
- infoTte() : retourne la valeur de linformation en tte de file - vide() : indique si la file est vide - ajouterEnFin(val) : ajoute une information en fin de file - supprimerEnTte() : supprime (et retourne) linformation en tte de file - saisirFile() - afficherFile()
Algorithmique 4 : Files et Piles 35

Dfinition de la classe File


Attributs :
tte : rfrence queue : rfrence {rfrence la tte de file} {rfrence la queue de file}

Mthodes
MFonction infoTte() retourne Info
{retourne la valeur enregistre dans la cellule de tte. Erreur si la file est vide}

paramtre (D) cible : File Mfonction vide() retourne boolen


{retourne vrai si la file est vide, faux sinon}

paramtre (D) cible : File Mprocdure ajouterEnFin(val)


{Cre une nouvelle cellule, y affecte la valeur val, et l'insre aprs la dernire cellule. Si file tait vide, elle contient maintenant lunique cellule qui vient d'tre cre.}

paramtre (D/R) cible : File ; (D) val : Info Mfonction supprimerEnTte() retourne Info
{Supprime la premire cellule de la file et retourne la valeur quelle contient. Si la file ne contenant qu'une seule cellule, la file devient vide. Erreur si la file est vide.}

paramtre (D/R) cible : File

36

Mthodes (suite)
MProcdure saisirFile ()
{Saisit des valeurs (de type Info), jusqu' une valeur d'arrt (constante dfinie dans l'algorithme appelant), et cre au fur et mesure autant de cellules que ncessaire, en y affectant les valeurs saisies.}

paramtre (R) cible : File variables uneVal : Info, cpt : entier dbut saisir(uneVal) ; cpt 0 tant que uneVal VALSTOP faire cpt cpt + 1 cible.ajouterEnFin(uneVal) saisir(uneVal) ftq afficher(La nouvelle file contient , cpt, cellules.) fin
Algorithmique 4 : Files et Piles 37

Mthodes (suite)
MProcdure afficherFile() {Affiche toutes les valeurs contenues dans la file cible.} paramtre (D) cible : File variables uneVal : Info copieCible : File dbut copieCible cible tant que non copieCible.vide() faire uneVal copieCible.supprimerEnTte() afficher(uneVal) ftq fin

Algorithmique 4 : Files et Piles

38

la classe Pile :
les besoins
Attributs :
- la tte mais pas de curseur

Mthodes :
- infoTte() : retourne la valeur de linformation en tte de pile - vide() : indique si la pile est vide - empiler(val) : ajoute une information en tte de pile - dpiler() : supprime (et retourne) linformation en tte de pile - saisirPile() - afficherPile()
Algorithmique 4 : Files et Piles 39

Dfinition de la classe Pile


Attributs :
tte : rfrence {rfrence la tte de pile}

Mthodes
MFonction infoTte() retourne Info
{retourne la valeur enregistre dans la cellule de tte. Erreur si la pile est vide}

paramtre

(D) cible : Pile

Mfonction vide() retourne boolen


{retourne vrai si la pile est vide, faux sinon}

paramtre (D) cible : Pile Mprocdure empiler(val)


{Cre une nouvelle cellule, y affecte la valeur val, et l'insre en tte de pile. Si pile tait vide, elle contient maintenant l'unique cellule qui vient d'tre cre.}

paramtre

(D/R) cible : Pile ; (D) val : Info

Mfonction dpiler() retourne Info


{Supprime la premire cellule de la pile et retourne la valeur quelle contient. Si la pile ne contenant qu'une seule cellule, la pile devient vide. Erreur si la pile est vide.}

paramtre (D/R) cible : Pile

40

Mthodes (suite)
MProcdure saisirPile()
{Saisit des valeurs (de type Info), jusqu' une valeur d'arrt (constante dfinie dans l'algorithme appelant), et cre au fur et mesure autant de cellules que ncessaire, en y affectant les valeurs saisies}

paramtre variables dbut

(R) cible : Pile uneVal : Info cpt : entier

saisir(uneVal) ; cpt 0 tant que uneVal VALSTOP faire cpt cpt + 1 cible.empiler(uneVal) saisir(uneVal) ftq afficher("La nouvelle pile contient", cpt, "cellules.")
Algorithmique 4 : Files et Piles 41

fin

Mthodes (suite)
MProcdure afficherPile() {Affiche toutes les valeurs contenues dans la pile cible.} paramtre (D) cible : Pile variables uneVal : Info copieCible : Pile dbut copieCible cible tant que non copieCible.vide() faire uneVal copieCible.dpiler() afficher(uneVal) ftq fin

Algorithmique 4 : Files et Piles

42

Exemple 1 : Parenthsage
Fonction bienForm(tab, nbr) retourne boolen
{tab est un tableau de nbr parenthses. Retourne vrai si le parenthsage est cohrent}

paramtres variables

(D) tab: tableau[1, MAX] de caractres; nbr : entier cpt, marque, val : entier; bienform : boolen unePile : Pile {unePile est vide au dpart}

dbut cpt 1; marque 0 {jeton} ; bienform vrai tant que bienform et cpt nbr faire si tab[cpt] = '(' alors unePile.empiler(marque) sinon si unePile.vide() alors bienform faux sinon val unePile.dpiler() {on a alors ') }
fsi

fsi cpt cpt +1 ftq retourne (bienform et unePile.vide() ) fin


Algorithmique 4 : Files et Piles 43

Parenthsage : simulation

Algorithmique 4 : Files et Piles

44

Exemple 2: valuation d'une expression arithmtique


5 * (((9 + 8) * (4 * 6)) + 7) OBJECTIF : 1. empiler (5) 2. empiler (9) 3. empiler (8) 4. empiler( dpiler () + dpiler()) 5. empiler (4) 6. empiler (6) 7. empiler (dpiler () * dpiler()) 8. empiler (dpiler () * dpiler()) 9. empiler (7) 10. empiler (dpiler () + dpiler()) 11. empiler (dpiler () * dpiler()) 12. afficher( dpiler())
Algorithmique 4 : Files et Piles 45

valuation : simulation

Algorithmique 4 : Listes chanes

46

Dabord : conversion infix

postfix

Procdure infixVersPostfix(tab, nbr, tab_res, nbr_res) paramtres (D) tab : tableau[1, MAX] de caractres (D) nbr : entier (R) tabRes: tableau[1, MAX] de caractres (R) nbrRes : entier variables i, j : entier ; unePile : Pile dbut i0; j0 tant que ( i < nbr) i i+1 si oprateur(tab[i]) alors unePile.empiler (tab[i]) sinon si tab[i] = ') alors j j + 1; tabRes[j] unePile .dpiler() ; sinon si nombre(tab[i]) alors j j+1 ; tabRes[j] tab[i] fsi fsi ftq nbrRes j fin Algorithmique 4 : Files et Piles

47

Conversion : simulation

Algorithmique 4 : Files et Piles

48

Ensuite : calculer postfix


Fonction calculerPostfix(tab, nbr) retourne(entier) paramtres (D) tab: tableau[1, MAX] de caractres (D) nbr : entier variables i, res : entiers unePile : Pile dbut i 1; res 0 tant que ( i nbr) faire si tab[i] = '+' alors res unePile.dpiler() + unePile.dpiler() sinon si tab[i] = -' alors res unePile.dpiler() - unePile.dpiler() sinon si tab[i] = '*' alors res unePile.dpiler() * unePile.dpiler() sinon si nombre(tab[i]) alors res tab[i] fsi unePile.empiler (res) i i+1 ftq retourne(unePile .dpiler()) fin
Algorithmique 4 : Files et Piles 49

Calculer postfix : simulation

Algorithmique 4 : Files et Piles

50

Retour lvaluation d'une expression arithmtique


Algorithme valuation {affiche l'valuation dune expression arithmtique} variables expInfix : tableau[1, MAX] de caractres {expression en criture infixe} expPostfix : tableau[1, MAX] de caractres {expression en criture postfixe} nbrEltsInfix : entier {nombre dlments de lexpression infixe} nbrEltsPostfix : entier {nombre dlments de lexpression postfixe} valeur : entier {rsultat de lvaluation} dbut saisirExpInfix(expInfix, nbrEltsInfix ) infixVersPostfix(expInfix, nbrEltsInfix , expPostfix , nbrEltsPostfix ) valeur calculerPostfix(expPostfix , nbrEltsPostfix ) afficher( Lvaluation de votre expression est , valeur) fin

Algorithmique 4 : Listes chanes

51

Fin Volume 4

Algorithmique 4 : Files et Piles

52

You might also like