Académique Documents
Professionnel Documents
Culture Documents
1 Piles et Files
Introduction :
L’une des problématiques les plus importantes de l’informatique de nos jours est le stockage de
données. Pour traiter efficacement ces dernières, il faut les ranger de manière adéquate, comme dans
la vie quotidienne. L’objet informatique qui stocke des valeurs s’appelle une structure de données, qui
est caractérisée par les opérations qu’elle permet et le coût de ces opérations. On peut par exemple,
souhaiter connaı̂tre le nombre d’éléments qu’elle contient, accéder à un élément donnée, en parcourir
tous les éléments... En MPSI, il vous a été présenté au moins deux structures de données : les tableaux
et les listes.
L’image associée à une pile est donc ”dernier arrivé, premier sorti”, ou en anglais ”last in, first out”
d’où l’abréviation LIFO.
Ces opérations sont traditionnellement appelées push pour empiler et pop pour dépiler.
Exemples d’applications des structures de pile
La structure de pile est couramment utilisée en ingénérie inverse, comme pour ”le retour à la page
précédente” sur le net, ou encore les touches ”Undo” des éditeurs de textes, ou tout autre ”annuler
saisie, annuler copier...”
En ce qui concerne les files, elles sont utilisées dans la vie courante pour faire la queue devant un
guichet par exemple, (on parle de queue en anglais). Etant donné une file d’attente, on peut
- demander si la file est vide, i.e. s’il y a des personnes qui attendent
- prendre le client en tête de file pour traiter sa demande
- placer un client à la queue de la file pour qu’il attende son tour.
L’image associée est donc premier arrivé premier sorti, ou en anglais ”first in, firts out”, d’où
l’abréviation FIFO.
Ces opérations sont toujours appelées push ( pour ajouter un élément) et pop ( pour enlever un
élément).
1.1 Piles
Définition 1. Les piles sont des structures de données mutables sur lesquelles on peut effectuer les
opérations suivantes :
- tester si la pile est vide
- empiler : ajouter un élément au sommet de la pile
- dépiler : extraire et renvoyer l’élément du sommet de la pile
Exemple 1. En informatique, les piles peuvent être utilisées pour stocker les appels successifs lors
de l’évaluation des fonctions récursive. On parle de pile d’exécution du programme.
Remarque :
En général, les piles ont une taille maximale fixée par le langage. Par exemple, le nimbre maximal
d’appels récursifs par défaut en Python est 1000. Lors de l’ajout d’un élément à une pile déjà pleine,
un message d’erreur est renvoyé : il s’agit d’un débordement de pile : ”stack overflow” en anglais).
En Python, les piles sont implémentées par des listes où seules mes opérations autorisées sont pop
et append. Nous illustrons ci-dessous la construction puis la manipulation d’une pile en insistant
sur son caractère mutable.
>>> pile=[]
>>> pile.append(1)
>>> pile.append(10)
>>> pile.append(2)
>>> print(pile)
[1, 10, 2]
>>> a=pile.pop()
>>> print(a)
2
>>> print(pile)
[1, 10]
>>> pile==[]
False >>> b=pile.pop()
>>> print(pile)
[1]
>>> pile==[]
False
>>> c=pile.pop()
>>> print(pile)
[]
>>> pile==[]
True
>>> pile.pop() Traceback (most recent call last)
File ”<stdin>”, line 1, in <module>
IndexError : pop from empty list
Remarque :
D’après les spécifications de Python sur les listes, ces opérations sont bien de complexité constante.
1.2 Files
Définition 2. Les files sont des structures de données mutables sur lesquelles on peut effectuer les
opérations suivantes :
- tester si la file est vide
- ajouter une élément à la queue de la file
- extraire en renvoyer l’élément du sommet de la file.
Exemple 2. En informatique, les files sont utilisées pour gérer les instructions que doit effectuer
un processeur. Les instructions sont stockées sous forme de file dans des buffers d’entrée/sorte en
attente de traitement par le processeur.
En Python, les files sont implémentées dans le module deque. Les opérations sont popleft et ap-
pend. Nous illustrons ci-dessous la manipulation d’une file en insistant sur son côté mutable.
>>> from collections import deque
>>> file=deque([])
>>> file.append(’Ada’)
>>> file.append(’Grace’)
>>> file.append(’Alan’)
>>> print(file)
deque([’Ada’,’Grace’,’Alan’])
>>> premiere=file.popleft()
>>> print(premiere)
Ada
>>> print(file)
deque([’Grace’,’Alan’])
>>> file==deque([])
False
>>> seconde=file.popleft()
>>> print(file)
deque([’Alan’])
>>> file==deque([])
False
>>> troisieme=file.popleft()
>>> print(file)
[]
>>> file==[]
True
>>> file.popleft() Traceback (most recent call last)
File ”<stdin>”, line 1, in <module>
IndexError : pop from empty deque
On parcourt alors tous les éléments du tableau exp, de la gauche vers la droite. Si l’élément courant
c est un opérateur arithmétiques (caractères + et ∗), on dépile les deux opérandes x et y de p et on
empile x + y ou x ∗ y selon la valeur de c.
On parcourt alors tous les caractères du mot, de la gauche vers la droite avec une boucle for.
Sinon, c’est qu’il s’agit d’une parenthèse fermante. Si la pile est vide, c’est que le mot n’est pas
bien parenthèse, car on vient de trouver une parenthèse fermante à laquelle ne correspond aucune
parenthèse ouvrante. On le signale immédiatement en renvoyant False.
On remarque ici en quoi la structure de pile est pertinente. Elle permet ici de faire correspondre
chaque parenthèse fermante à la parenthèse ouvrante la plus proche, c’est-à-dire celle qui est au
somme de la pile. Quand on sort de la boucle for, il ne reste qu’à vérifier que la pile est bien vide.
En effet, le mot pourrait contenir plus de parenthèses ouvrantes que de parenthèses fermantes, et il
faut alors signaler que le mot est mal parenthésé.
2 Programmation objet
Le principe de programmation orientée objet est de créer des ensembles informatiques particuliers
auxquels on pourra appliquer des fonctions dédiées. Ces ensembles sont appelées de classes, les
éléments de ces ensembles sont appelés les objets, et les fonctions s’appliquant à des objets sont
appelées des méthodes.
Dans le cas de Python, vous avez déjà rencontré des méthodes s’appliquant à certains objets. Par
exemple, vous avez déjà vu l’utilité de la méthode sort qui s’applique aux objets de la classe list et
qui permet de trier une liste.
Dans ce chapitre, nous verrons comment créer nos propres classes d’objets et les méthodes qui pour-
ront leur être appliquées.
2.1 Les classes
Il est très simple de créer une classe d’objets. Voici un exemple.
i) class Maclasse( object ) :
ii) pass
Le mot clé pass joue le rôle d’un bloc d’instructions qui n’a aucune action. Il est très utile au
développement d’un projet pour créer des fonctions ou des classes. Par convention, les noms de classe
commenceront par une majuscule.
Nous allons à présent construire une classe permettant de représenter des distances en kilomètres ou
en miles. On définit ensuite la classe des objets de type Distance, qui dispose de trois attributs. Ils
ont pou nom unites, unite et dist.
Le mot clé self fait référence à l’objet lui-même. La fonction init est appelée lors de la création
d’un objet appartenant à la classe distance qui permet de définir et d’initialiser tout objet de la
classe, la syntaxe est la suivante :
Par exemple, l’instruction d=Distance(10) crée une variable nommée d appartenant à la classe
Distance. Le paramètre correspondant au champ unité n’ayant pas été précisé, l’attribut unité est
initialisé à la valeur ’km’.
Dans le cas de la classe Distance, lors de la création d’un objet, on initialise les attributs unites,
unité et dist. Chaque attribut d’un objet est accessible avec une commande du type
< nom de l’objet >.< nom de l’attribut >.
Notez bien la présence du point entre le nom de l’objet et le nom de l’attribut.
Exemple 3. Dans les lignes de commande suivantes, on crée une variable de type Distance, puis
on accède à chacun de ses attributs.
>>> d = Distance(10)
>>> d.unites
[0 km0 ,0 mile0 ]
>>> d.unite
’km’
>>> d.dist
10
>>> d = Distance(1430)
>>> print(”distance d = ” +str(d))
distance d = 1430 km
>>> d.changeUnite(’mile’)
>>> print(”distance d =” + str(d))
distance d=888.5608017 mile
Exercice 1.
1)
i) Définir une classe Intervalle permettant de représenter informatiquement les segments [a, b].
ii) Définir une méthode intersection permettant de calculer l’intersection de deux intervalles.
iii) Définir une méthode est vide qui retourne vrai si l’intervalle est vide, et faux sinon.
iv) Définir la méthode str pour un affichage adapté des intervalles.
2)
i) Définir une classe Temperature permettant de représenter informatiquement des températures
exprimées en Celsius, en Kelvin, ou en Fahrenheit.
ii) Définir la méthode str pour un affichage de la valeur de la température avec son unité.
iii) Définir une méthode convertir permettant le changement d’unité.