Académique Documents
Professionnel Documents
Culture Documents
5.les Piles Et Files en Python - 2016
5.les Piles Et Files en Python - 2016
1. Définitions
Les piles (stack) et les files (queue) constituent des structures de données. Elles vont, comme leur nom
l'indique, nous permettre de stocker diverses données, comme pourrait le faire un tableau.
Une pile permet de réaliser ce que l'on nomme une LIFO (Last In First Out), ce qui signifie en clair que
les derniers éléments à être ajoutés à la pile seront les premiers à être récupérés. Il est possible de
comparer cela à une pile d'assiettes. Lorsqu'on ajoute une assiette en haut de la pile, on retire toujours en
premier celle qui se trouve en haut de la pile, c'est-à-dire celle qui a été ajoutée en dernier, sinon tout le
reste s'écroule.
Une file, quant à elle, permet de réaliser une FIFO (First In First Out), ce qui veut dire que les premiers
éléments ajoutés à la file seront aussi les premiers à être récupérés.
Dernier élément
empilé (ajouté)
…………………
Premier élément
Premier élément
empilé (ajouté)
dépilé (supprimé)
First In
First Out
Les piles peuvent être utilisées dans des algorithmes d'évaluation d'expressions mathématiques.
Les files peuvent être utilisées afin de mémoriser des données en attente de traitement. (guichets
d’attente par exemple)
SOLUTION :
def affichepile(p):
print()
print('| |')
i = len(p)-1
while i>=0:
print('|---|')
print('|',p[i],'|')
i = i-1
print(' ---')
### fonctions avancées sur les piles
# inversion d'une pile
def inversepile(p):
q = copiepile(p)
r = pilevide()
while (not(estvide(q))):
ajoute(depile(q),r)
return r
# vérification parenthésage
def estouvrante (c) :
return (c=='(') or (c=='{') or (c=='[')
def fermante (c) :
if c=='(':
return ')'
elif c=='{':
return '}'
elif c=='[':
return ']'
print()
### tests
mapile = pilevide()
ajoute(2,mapile)
ajoute(8,mapile)
ajoute(5,mapile)
ajoute(0,mapile)
ajoute(3,mapile)
ajoute(7,mapile)
ajoute(9,mapile)
affichepile(mapile)
affichepile(inversepile(mapile))
verifparenthese("coucou")
verifparenthese("([{{{}}}]{)(()})")
verifparenthese("([{{{}}}]{()()})")
verifparenthese("(([{{{}}}]{()()})")
verifparenthese("([{{{}}}]{()()}))")
evaluepostfix("12+4*3+")
0 AR 0 4 0 4 0
1 1 21 1 21 1
2 2 AR 2 13 2
AR
AE 1 3 AE 1 3 AE 1 3 1 3
AE
5 4 5 4 5 4 5 4
7 5 7 5 7 5 7 5
AR 6 2 6 2 6 2 6
7 19 7 19 7 19 7
Etat Initial Réception de deux Réception de deux Réception du nombre 13
nombres 2 et 19 nombres 4 et 21 la file est déclarée pleine
Symétriquement la figure suivante montre comment une file se vide. La file est vide si , après émission d’un nombre, la
variable AE rattrape la variable AR.
0
4 0 AE 4 0 0
1
21 1 21 1 1
2
13 2 13 2 AE 13 2 AR
3
AR 3 AR 3 AR 3 AE
4
4 4 4
5
5 5 5
6
AE 2 6 6 6
7
19 7 7 7 Emission du nombre 13 la
Etat Initial émission de deux Emission de deux
file est déclarée vide
nombres 2 et 19 nombres 4 et 21
On demande de définir:
- Une fonction CrerFile (Dmax) qui crée une file (tableau vide de taille Dmax) et initialise AE et AR
- Une fonction EstVide(F) qui retourne True si la file F est vide ei False sinon
- Une fonction EstPleine(F) qui retourne True si la file F est pleine et False sinon
- Une fonction Ajouter(F,v) qui permet d’ajouter la valeur v dans la file F
Il existe un type supplémentaire : deque, dans le module collections permettant de simuler les files
(queue en anglais) : from collections import deque pour utiliser le module
d=deque() : création d'une file vide ou d=deque( (4,5,6) ) : création d'une file à partir d'un tuple
len(d) permet de savoir si la file est vide et d.pop() renoie l'élément de tête de file
d.appendleft(v) ajoute un élément un fin de file. Début et fin sont interchangeables car il existe aussi
les fonctions suivante qui s'exécutent en temps constant : d.popleft() et d.append(v) . Le type
de deque permet en outre de construire des files d'une certaines longueur maximum si bien que
l'ajout en fin de file de nouveaux éléments éjecte les éléments de début de liste (ou l'inverse)
Exemple.
Solution
Remarque : lorsqu’on dépasse la taille max , l’ajout d’un élément provoque la sortie de l’élément qui
est en entête de la file.
Solution :
Solution du Problème : gestion de la mémoire en utilisant les files
Programme principal :
Test de la File
Application2 :
On se propose de simuler une file d’attente. La situation est la suivante :
Des clients arrivent dans un bureau de poste qui a trois guichets, A, B et C (on suppose pour
commencer que les guichets réalisent les mêmes opérations). Toutes les dt secondes (par
exemple dt=10),
On ajoute les clients qui sont insérés dans la file d’attente,
on libère les guichets qui peuvent l’être (si la date d’arrivée du client augmentée du temps de
Traitement a dépassé la date courante, le client est parti depuis le dernier examen de la
situation) ;
On déplace les clients en tête de file vers les guichets libres.
On travaillera en deux temps : architecture générale du programme puis détails d’implémentation (et
on finira avec un programme de simulation).
Ce programme met en place des variables globales qui seront gérées au cours d’itérations simulant
un décompte discret du temps (actualisation en t0= 0, t1 = t0 + dt, t2 = t1 + dt, ...).
Le tableau qui suit présente ce que pourraient être ces variables (on fera avec) et ce que pourrait être
une fonction d’examen des guichets...
>>>nbre_total_clients = 0
>>>guichets = [[’A’, 0, 0, None], [’B’, 0, 0, None], [’C’, 0, 0, None]]
’’’ liste de guichets, avec nom, date d’arrivée du dernier client (en secondes), temps de traitement
prévu, identité client.’’’
>>>file_attente = creer_queue() # ’’la structure de file (ou de queue) qui contient les clients’’’
>>>#----------- un exemple de fonction ------------
#-------------------------- guichets = **’A’, 0, 20, ’C_1’+, *’B’, 0, 12, ’C_1’+, *’C’, 0, 11, ’C_1’++
>>> liberer_guichets (guichets, 14)
>>> print(guichets)
[[ ’A’ , 14 , 0, None ], *’B’, 0, 12, ’C_1’+, *’C’, 0, 11, ’C_1’++
b. On suppose que dans la fonction def LoiPoisson(D) , D est une distribution de probabilités sur N
(ou sur {0, 1, ..., N }), que random.random() renvoie un nombre aléatoire de loi uniforme sur [0,1].
Démonter que LoiPoisson(D) est une variable aléatoire telle que P ( LoiPoisson(D) = k) = D[k]).
def LoiPoisson(alpha):
'''Variable aleatoire de loi de Poisson de paramètre alpha '''
e = np.exp(-alpha)
U = random.random()
s, k, f = e, 0, 1
while s < U:
k , f = k +1, f*k
s = s + e*alpha**k/f
return k
3.2.3 On suppose que l’on sait écrire une fonction simulant le nombre d’arrivées par unité de temps
(ici dt) dans un bureau de poste
a. Définir une fonction arrivees (file, alpha) qui construit la file d’attente avec les clients arrivant
sur le bureau de poste de façon aléatoire.
b. Compléter la fonction de simulation.