Vous êtes sur la page 1sur 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

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

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

Courante

donne
donne

donne
Dernire
("queue")
donne

Suivante

donne
Algorithmique 4 : Listes chanes

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

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

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

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 :

listeA

tte

val1

val2

val3

val4

curseur
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


cellule courante

insrerAvant :
en milieu de liste

1e donne

nouvelle cellule

2e donne

nouvelle
donne

3e donne

4e donne

nouvelle cellule courante

insrerAvant :
en dbut de liste
nouvelle cellule
nouvelle
donne

cellule courante
1e donne

Algorithmique 4 : Listes chanes

2e donne

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

cellule courante

2e

donne

3e

nouvelle
donne

donne

insrerAprs :
en fin de liste
1e donne

nouvelle cellule
4e donne

nouvelle cellule courante

2e donne

3e donne

cellule courante
Algorithmique 4 : Listes chanes

nouvelle
donne

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


cellule courante,
supprimer

supprimer :
en milieu de liste
1e donne

2e donne

supprimer :
en fin de liste
1e donne

3e donne

4e donne

5e donne

nouvelle cellule courante

2e donne

3e donne

4e 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) 0
variable
listeA : Liste
dbut
listeA.saisirListe()
afficher("Liste saisie : ")
listeA.afficher()
fin

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

tte

Julie

Anna

Pierre

Daniel

cible. supprimerEnTte()

queue
cible.ajouterEnFin ("Daniel")

- 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

tte

Julie

Anna

Pierre

Daniel

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.")

fin
Algorithmique 4 : Files et Piles

41

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

Vous aimerez peut-être aussi