Vous êtes sur la page 1sur 14

Chapitre 3 Structures de donnes linaires : listes, piles et files

1. Introduction Le but de ce chapitre est de dcrire des reprsentations des structures de donnes de base telles les listes en gnral et deux forme restreintes: les piles et les files. Lautre but recherch est de voir limportance de ces structures travers quelques exemples dapplications 2. Les listes Les listes sont des structures de donnes informatiques qui permettent, au mme titre que les tableaux par exemple, de garder en mmoire des donnes en respectant un certain ordre : on peut ajouter, enlever ou consulter un lment en dbut ou en fin de liste, vider une liste ou savoir si elle contient un ou plusieurs lments.

2.1. Quelques oprations sur les listes 1. tester si la liste est vide (ou la mettre vide) 2. accder au kme lment de la liste (pour le modifier, supprimer, etc ...) 3. insrer un nouvel lment derrire le kme 4. fusionner 2 listes 5. rechercher un lment d'une valeur particulire 6 . trier 7) etc. 1

But: en fonction des oprations choisies, choisir une reprsentation interne pour lesquelles les oprations sont efficaces. 2.2 Implantation des listes. Il existe plusieurs mthodes pour implmenter des listes. Les plus courantes sont lutilisation de tableaux et de pointeurs. A. Utilisation de tableaux : implmenter une liste laide dun tableau nest pas trs compliqu. Les lments de la liste sont simplement rangs dans le tableau leur place respective.Cependant, lutilisation de tableaux possde quelques inconvnients :
o La dimension dun tableau doit tre dfinie lors des dclarations et ne peut donc pas tre

modifie dynamiquement lors de lexcution dun programme. La solution consiste donc dfinir un tableau dont la taille sera suffisante pour accueillir la plus grande liste pouvant tre utilise, et dassocier au tableau une variable indiquant le nombre dlments contenus dans le tableau. o Le tableau tant surdimensionn, il encombre en gnral la mmoire de lordinateur. o Si la taille maximum venait tre augmente, il faudrait modifier le programme et recompiler. o Lorsque lon retire un lment du tableau, en particulier en dbut de liste, il est ncessaire de dcaler tous les lments situs aprs llment retir. B. Utilisation de pointeurs : les pointeurs dfinissent une adresse dans la mmoire de lordinateur, adresse qui correspond lemplacement dune autre variable. Il est possible tout moment dallouer cet espace dynamiquement lors de lexcution du programme 2.2.1 Reprsentation contigu d'une liste par tableau Avantage: l'accs au kme lment est immdiat: t[k] Inconvnient: l'insertion d'un lment est trs coteux car il faut dcaler d'un cran tous les lments suivants (jusqu' n+1 affectations) la suppression d'un lment, pour les mmes raisons, peut entraner jusqu' n-1 affectations. 2.2.2. Reprsentation chane d'une liste laide dun tableau Principe: reprsenter chaque lment de la liste un endroit quelconque de la mmoire Exemple: la liste L = <a1, a2, a3, a4>

valeur 1 2 3 4 5 6 7 Inconvnient : a1 a3 a4 a2

pointeur 0 (indice fictif) 5 2 1

Avantage: si par exemple on insre a'3 aprs a3 dans la liste, on ne ralise que 3 affectations. Idem pour l'insertion et la suppression, cot: O(1) si on connat l'endroit pour insrer. Une liste se dfinit de faon rcursive Exemple: struct T_cellule{ int val; T_cellule * suiv; } Dfinition: Une liste d'lments de type T est : soit vide // ici le pointeur = 0 soit la donne de : * un lment de type T (le premier lment de la liste) * une liste (d'lment de type T): la liste prive de son premier lment. Variantes utiles d'une liste --> les listes circulaires: on a une liste L = <a0, a1, a2, ..., an-1> dont le suivant du dernier an-1 est le premier (a0)

liste chane circulaire les listes doublement chanes: utile quand on veut accder facilement au prdcesseur d'un lment de la liste.

liste doublement chane

3. Les piles Une pile est une liste sur laquelle on autorise seulement 4 oprations: 1. consulter le dernier lment de la pile (le sommet de la pile) 2. tester si la pile es vide 3. empiler un lment, le mettre au sommet de la pile ==> PUSH 4. dpiler un lment (par le sommet) ==> POP Toutes les oprations sont effectues sur la mme extrmit; on parle de structure en FIFO.

3.1. Reprsentation d'une pile par tableau Avantage: Facile car on ne modifie une pile que par un bout. Les oprations sont faciles. Inconvnient: la hauteur est borne (allocation statique de la mmoire) Reprsentation chane Avantage: facile avec la tte de liste chane sur le haut de la pile (en particulier p = 0 si la pile est vide) Inconvnient: espace occup par les pointeurs

3.2. Applications des piles 1. Appels de fonctions: Quand une fonction est appele, les paramtres (incluant ladresse de retour) doivent tre passs la fonction appelante. Si ces paramtres sont sauvegards dans une mmoire fixe, alors la fonction ne peut pas tre appele rcursivement du moment que la premire adresse va tre crase par le deuxime retour dadresse avant que la premire ne soit utilise. Les piles sont souvent ncessaires pour rendre itratif un algorithme rcursif. Exemple : Une version du tri rapide rcursif en tri rapide itratif est comme suit. La pile est ainsi mise contribution pour sauvegarder les extrmits de la partie du tableau pour laquelle on veut trouver le pivot. void tri_rapide_bis(int tableau[],int debut,int fin){ int pivot,i,j; empiler(debut); empiler(fin); while (!empty_stack){ pivot=partition(tableau,debut,fin); i =depiler; j= depiler; pivot=partition(tableau,i,j); /* partition gauche */ if (pivot > i){ empiler(i); empiler(pivot-1); }; else if (j > pivot){ empiler(pivot+1); /* partition droite */ empiler(j)}} Exercice 1: rendre itratif le tri par fusion. Exercice 2: discuter les avantages et inconvnients lutilisation explicite dune pile pour simuler la rcursivit. 2.2. Analyse syntaxique : qui est une phase de la compilation qui ncessite une pile. Par exemple, le problme de la reconnaissance des mots bien parenthss Nous devons crire un programme qui : accepte les mots comme (), ()(()) ou ((()())()) ; rejette les mots comme )(, ()(() ou ((()()))). Nous stockons les parenthses ouvrantes non encore refermes dans une pile de caractres, Le programme lit caractre par caractre le mot entr : si c'est une ouvrante, elle est empile ; si c'est une fermante, l'ouvrante correspondante est dpile. Le mot est accept si la pile n'est jamais vide la lecture d'une fermante ; et si la pile est vide lorsque le mot a t lu. 5

2.3. Calcul arithmtique : Une application courante des piles se fait dans le calcul arithmtique: l'ordre dans la pile permet d'viter l'usage des parenthses. La notation postfixe (polonaise) consiste placer les oprandes devant l'oprateur. La notation infixe (parenthse) consiste entourer les oprateurs par leurs oprandes. Les parenthses sont ncessaires uniquement en notation infixe. Certaines rgles permettent d'en rduire le nombre (priorit de la multiplication par rapport l'addition, en cas d'oprations unaires reprsentes par un caractre spcial (-, !,...). Les notations prfixe et postfixe sont d'un emploi plus facile puisqu'on sait immdiatement combien d'oprandes il faut rechercher. Dtaillons ici la saisie et l'valuation d'une expression postfixe: La notation usuelle, comme (3 + 5) * 2, est dite infixe. Son dfaut est de ncessiter l'utilisation de parenthses pour viter toute ambigut (ici, avec 3 + (5 * 2)). Pour viter le parenthsage, il est possible de transformer une expression infixe en une expression postfixe en faisant "glisser" les oprateurs arithmtiques la suite des expressions auxquelles ils s'appliquent. Exemple: (3 + 5) * 2 s'crira en notation postfixe (notation polaise): 3 5 + 2 * alors que 3 + (5 * 2) s'crira: 3 5 2 * + Notation infixe: A * B/C. En notation postfixe est: AB * C/. On voit que la multiplication vient immdiatement aprs ses deux oprandes A et B. Imaginons maintenant que A * B est calcul et stock dans T. Alors la division / vient juste aprs les deux arguments T et C. Forme infixe: A/B ** C + D * E - A * C Forme postfixe: ABC ** /DE * + AC * -

Evaluation en Postfix
Considrons lexpression en postfixe suivante:
6523+8*+3+*

Algorithm
Initialiser la pile vide; while (ce nst pas la fin delexpression postfixe) { prendre litem prochain de postfixe; if(item est une valeur) empiler; else if(item operateur binaire ) { dpiler dans x; dpiler dans y; effectuer y operateur x;

empiler le rsultat obtenu; } else if (item oprateur unaire) { dpiler dans x; effectuer oprateur(x); empiler le rsultat obtenu; } } la seule valeur qui reste dans la pile est le rsultat recherch. Oprateur binaries: +, -, *, /, etc., Oprateur unaires: moins unaire, racine carre, sin, cos, exp, etc. Pour 6 5 2 3 + 8 * + 3 + * Le premier item est une valeur (6); elle est empile. Le deuxime item est une valeur (5); elle est empile. Le prochain item est une valeur (2); elle est empile. Le prochain item est une valeur (3); elle est empile. La pile devient

TOS=> 3
2 5 6

Les items restants cette tape sont: + 8 * + 3 + * Le prochain item lu est '+' (oprateur binaire): 3 et 2 sont dpils et leur somme '5' est ensuite empile:

TOS=> 5
5 6

Ensuite 8 est empil et le prochain oprateur *: TOS=> 8


5 5 6

TOS=> 40
5 6

(8, 5 sont dpils, 40 est empil)

Ensuite loprateur + suivi de 3:

TOS=> 6

45

TOS=> 3
45 6

(40, 5 sont dpils ; 45 pushed, 3 est empil Ensuite loprateur +: 3 et 45 sont dpils et 45+3=48 est empil

TOS=> 48
6

Ensuite cest loprateur *: 48 et 6 sont dpils et 6*48=288 est empil

TOS=> 288 Il ny plus ditems lire dans lexpression postfixe et aussi il ny a quune seule valeur dans la pile reprsentant la rponse finale: 288. La rponse est trouv en balayant une seule fois la forme postfixe. La complexit de lalgorithme est par consquent en O(n); n tant la taille de la forme postfixe. La pile a t utilise comme une zone tampon sauvegardant des valeurs attendant leur oprateur.

Infixe Postfixe
Bien entendu la notation postfixe ne sera pas dune grande utilit sil nexistait pas un algorithme simple pour convertir une expression infixe en une expression postfixe. Encore une fois, cet algorithme utilise une pile.

Lalgorithme
initialise la pile et loutput postfixe vide; while(ce n,est pas la fin de lexpression infixe) { prendre le prochain item infixe

if(item est une valeur) concatner item postfixe else if(item == () empiler item else if(item == )) { dpiler sur x while(x != () concatner x postfixe & dpiler sur x } else { while(precedence(stack top) >= precedence(item)) dpiler sur x et concatner x postfixe; empiler item; } } while (pile non vide) dpiler sur x et concatner x postfixe; Prcdence des oprateurs (pour cet algorithme): 4 : ( dple seulement si une ) est trouve 3 : tous les oprateurs unaires 2:/* 1:+Lalgorithme passe les oprandes la forme postfixe, mais sauvegarde les oprateurs dans la pile jusqu ce que tous les oprandes soient tous traduits. Exemple: considrons la forme infixe de lexpression a+b*c+(d*e+f)*g Stack Output

ab

TOS=>

abc

TOS=>

* +

abc*+

TOS=>

+ 9

TOS=>

* ( +

abc*+de

TOS=>

+ ( +

abc*+de*f

abc*+de*f+

TOS=>

TOS=>

* +

abc*+de*f+g

empty Un autre exemple

abc*+de*f+g*+

Comme nous voulons que A + B * C gnre ABC * +, notre algorithme effectuera une succession dempilement - dpilement suivants (la pile est la droite): Item Pile Postfixe ---------- ---------aucun vide aucun A vide A
+ B + + A AB

ce stade, lalgorithme dtermine qui de * et + doit tre plac la fin de la pile. Comme lopration * a une plus grande prcdence, on empile *
* C +* +* AB ABC

Et on dpile ABC*+ Comme les donnes en entre sont termines, on dpile tout le reste de la pile pour donner lexpression postfixe finale suivante: 10

ABC * +

4. Les files (d'attente)

4.1. Dfinition et exemples Une file est une structure de donnes dynamique dans laquelle on insre des nouveaux lments la fin (queue) et o on enlve des lments au dbut (tte de file). Lapplication la plus classique est la file dattente, et elle sert beaucoup en simulation. Elle est aussi trs utilise aussi bien dans la vie courante que dans les systmes informatiques. Par exemple, elle modlise la file dattente des clients devant un guichet, les travaux en attente dexcution dans un systme de traitement par lots, ou encore les messages en attente dans un commutateur de rseau tlphonique. On retrouve galement les files dattente dans les programmes de traitement de transactions telle que les rservations de siges davion ou de billets de thtre. Noter que dans une file, le premier lment insr est aussi le premier retir. On parle de mode daccs FIFO (First In Fist Out). Comportement d'une pile: Last In First Out (LIFO) Comportement d'une file: First In First Out (FIFO) La file est modifie ses deux bouts.

11

4.2. Quatre oprations de base 1. consulter le premier lment de la file 2. tester si la file est vide 3. enfiler un nouvel lment: le mettre en dernier 4. dfiler un lment, le premier (le supprimer) 4.3. Reprsentation d'une file par liste chane Il est facile d'implanter les quatre oprations ci-dessus, mais on perd la place due aux pointeurs.

4.4. Reprsentation d'une file par tableau vision circulaire du tableau

12

4.5 File de priorit: Les lments de la file ont chacun une priorit. Ile but est daccder llment prioritaire et de le retirer (voir dans le chapitre sur les arbres). 4.6 Quelques applications 1. Impression de programmes maintenir une file de programmes en attente dimpression 2. Disque driver maintenir une file de requtes disque dinput/output disque 3. Ordonnanceur (dans les systmes dexploitation) maintenir une file de processus en attente dun temps machine 4. Considrons un fichier denregistrements. Chaque enregistrement est constitu dinformations concernant le nom, sexe, date de naissance dune personne. Les enregistrements sont tris par dates de naissance. Le problme quon se propose de traiter est de rarranger les enregistrement de telles manire que les enregistrements de personnes de sexe fminin prcdent ceux de sexe masculin.

13

Solution 1 : utiliser un algorithme de tri

complexit O(n log n). complexit O(n).

Solution 2 : on peut faire mieux en utilisant une file

a. crer une file pour les femmes et une autre file pour les hommes b. rpter jusqu ce que le fichier soit vide b.1. soit p la prochaine personne traiter dans le fichier b.2. si p est une femme, lajouter la fin de la file des femmes b.3. si p est un homme, lajouter la fin de la file des hommes c. rpter jusqu ce que la file des femmes soit vide prendre llment de la tte de file des femme et le recopier d. rpter jusqu ce que la file des homme soit vide prendre llment de la tte de file des homme et le recopier

Rfrences et sources : Cormen et al. (1990) : Algorithms, MacGrw Hill. G. Bebis (2003): Notes de cours, Universit du Nvada, USA. S. Sahni (1999) : Notes de cours sur data structures and algorithms, University of Florida. R. Cori, J.J. Lvy (2000) : Notes de cours sur les algorithmes et programmation, cole Polytechnique. 5. D.A. Watt, D.F. Brown (2001): Notes de cours sur Queue ADT, Universit de Montral. 1. 2. 3. 4.

14

Vous aimerez peut-être aussi