Les listes, les piles, les files

Numérique et sciences informatiques

donnees

Les listes chainées

Les listes chaînées associent à chaque donnée (de même type) un pointeur indiquant la localisation dans la mémoire de la donnée suivante (à l’exception de la dernière, qui pointe vers une valeur particulière indiquant la fin de la liste).

base de donnees
Représentation d'une liste comportant 3 élements : 1,2 et 4

Entrainement 1:

Identififer l'adresse de stockage des données pour les variables a = 1 b et b = 2 avec la méthode python id(a)

Dans une liste chaînée, il est impossible de connaître à l’avance l’adresse d’une case en particulier, à l’exception de la première. Pour accéder à la nème case il faut donc parcourir les n − 1 précédentes : le coût de l’accès à une case est proportionnelle à la distance qui la sépare de la tête de la liste. En contrepartie, ce type de structure est dynamique : une fois la liste crée, il est toujours possible de modifier un pointeur pour insérer une case supplémentaire.

Contrairement à ce que pourrait laisser croire son nom, la classe list en python n’est pas une liste chaînée au sens qu’on vient de lui donner, mais une structure de donnée plus complexe qui cherche à concilier les avantages des tableaux et des listes chaînées.

La liste est constituée de trois cellules, représentées ici par des rectangles.
Chaque cellule possède une première partie (la tête), nommée car(CAR (Contents of Address Register) : le premier élément de la liste), qui contient l’entier correspondant, et d’une deuxième partie (la queue), nommée cdr (CDR (Contents of Decrement Register) : le reste de la liste), qui contient un lien vers la cellule suivante. On a donc affaire à une chaîne de cellules, ce qui justifie la dénomination courante de liste chaînée. Le champ cdr de la dernière cellule renvoie vers une liste vide, conventionnellement représentée par un hachurage (NIL : Abréviation du latin nihil, rien).

Le premier champ d’une cellule contient ici un entier (car on considère une liste d’entiers) alors que le deuxième est une liste, c’est-à-dire un lien vers une autre cellule.

base de donnees
Représentation d'une liste comportant 4 élements : voici,une,liste et chainée

Voici les opérations qui peuvent être effectuées sur une liste :

Action Instruction
Créer une liste L vide L = vide()
tester si une liste est vide est_vide(L) renvoie vrai si la liste L est vide
ajouter un élément x en tête de liste L ajoute_entete (x,L)
Supprimer la tête x d’une liste L et renvoyer cette tête x suppr_entete(L)
compter le nombre d'éléments présents dans une liste L compte(L)
Créer une nouvelle liste L1 à partir d'un élement x d'une liste existante L L1 = cons(x,L)

Entrainement 1 :

Donner la composition de L,L1 et L2 après cette série d'instruction :

L,L1,L2 = vide()
ajoute_entete(4,L)
ajoute_entete(9,L)
ajoute_entete(2,L)
suppr_entete(L)
L1 = vide()
L2 = cons(19, cons(4, cons(10, cons (2, cons(6, cons(0,L1)))))

Implémentation en python

def creer_liste():
    """création d'une liste"""
    return []

def est_vide(liste):
    """teste si liste est vide et renvoie le booléen obtenu"""
    return (liste == [])

def ajoute_entete(e,liste):
    """ajouter un élément e en tête de liste liste"""
    liste.insert(0,e)

def suppr_entete(file):
    """identique à file.pop(0)"""
    del file[0]

def taille(liste):
    """Renvoie le nombre d'élément de la liste"""
    return len(liste)

def get(i,liste):
    """Renvoie le ième élément de la liste"""
	return liste[i]

#########################################################
liste = creer_file()
ajoute_entete(1,f)
print(f)
ajoute_entete(2,f)
ajoute_entete(3,f)
print(f)
est_vide(f)
suppr_entete(f)
print(f)
suppr_entete(f)
suppr_entete(f)
print(f)
print(est_vide(f))
Un exemple de classe python pour les listes chainées avec POO (lvl 2)

Les piles

Les piles sont fondées sur le principe du « dernier arrivé, premier sorti » ; on les dit de type LIFO (Last In,First Out). C’est le principe même de la pile d’assiette : c’est la dernière assiette posée sur la pile d’assiettes sales qui sera la première lavée.

pile
Pile : LIFO

Une réalisation concrète de la structure pile doit fournir dans l’idéal :

Action Instruction
Créer une pile P vide creer_pile_vide()
tester si une pile est vide est_vide(Pile) renvoie vrai si la pile pile est vide
Insérer un nouvel élément e au sommet de la pile Pile(push) empiler(Pile,e)
Enlèver et retourner l'élément au sommet de la pile Pile (pop) depiler(Pile)
Compter le nombre d'éléments présents dans une pile Pile taile(Pile)
Créer une nouvelle liste L1 à partir d'un élement x d'une liste existante L L1 = cons(x,L)

Entrainement 2 :

Que contiennent les variables P et N après cette série d'instruction :

P= creer_pile_vide()
empiler(P,3)
empiler(P,2)
N = depiler(P)
empiler(P,5)
empiler(P,7)
empiler(P,9)

Implémentation en python

def creer_pile_vide():
    """création de la pile vide"""
    return []

def est_vide(pile):
    """teste si pile est vide et renvoie le booléen obtenu."""
    return (pile == [])

def taille (pile):
    """Renvoie le nombre d'élément de la pile"""
    return len(pile)

def depiler(pile):
    """depile l'élément x sur la pile pile
    pile.pop()"""
    if est_vide(pile):
        return print("la pile est déjà vide") 
    else:
        del pile[-1]# on depile


def empiler(pile,e):
    """empile l'élément x sur la pile p
        pile.append(e)
        """
    pile[len(pile):] = [e]# on empile

def sommet(pile):
    """renvoie le sommet de la pile"""
    return pile[-1]


p = creer_pile_vide()
est_vide(p)
empiler(p,1)
empiler(p,2)
empiler(p,3)
print(p)
print(est_vide(p))
depiler(p)
print(p)
print(sommet(p))


Un exemple de classe python pour les piles avec POO (lvl 2)

Les Files

Les files sont fondées sur le principe du « premier arrivé, premier sorti » ; on les dit de type FIFO (First In,First Out). C’est le principe de la file d’attente devant un guichet.

file
File : FIFO

Une réalisation concrète de ces structures doit fournir dans l’idéal :

  • une fonction de création d’une file vide ;
  • deux fonctions d’ajout et de suppression;
  • une fonction vérifiant si une file est vide.


on peut réaliser les opération ssuivantes sur un objet de type File:

Action Instruction
Créer une file File vide creer_file_vide()
tester si une file est vide est_vide(File) renvoie vrai si la pile pile est vide
Enfiler un nouvel élément e : le mettre en dernier(enqueue) enfiler(File,e)
Défiler un élément, le premier (le supprimer) (dequeue) defiler(File)
Afficher le nombre d'éléments présents dans une file File longeur(File)

Entrainement 3 :

Que contiennent les variables F et N après cette série d'instruction :

F = creer_file_vide()
enfiler(F,3)
enfiler(F,2)
N = defiler(F)
enfiler(F,5)
enfiler(F,7)
enfiler(F,9)

Implémentation en python

###########################################
#Extrait de la documentation python
from collections import deque
queue = deque(["Eric", "John", "Michael"])
queue.append("Terry")           # Terry arrives
queue.append("Graham")          # Graham arrives
queue.popleft()                 # The first to arrive now leaves
print(queue)
queue.popleft()                 # The second to arrive now leaves
print(queue)                    # Remaining queue in order of arrival
print("-----------------------------------------")


##################################################################

def creer_file():
    """création de la file"""
    return[]

def est_vide(file):
    """teste si file est vide et renvoie le booléen obtenu"""
    return (file == [])

def enfiler(e,file):
    """file.append(e)"""
    file[len(file):] = [e]

def defiler(file):
    """return file.pop(0)"""
    del file[0]

def longeur(file):
    """Renvoie le nombre d'élément de la file"""
    return len(file)

#########################################################
f= creer_file()
enfiler(1,f)
print(f)
enfiler(2,f)
enfiler(3,f)
print(f)
est_vide(f)
defiler(f)
print(f)
defiler(f)
defiler(f)
print(f)
print(est_vide(f))

Un exemple de classe python pour les files avec POO (lvl 2)


Entrainement 6 : proposer un fonction qui vide une file

Savoir faire

  • Savoir spécifier une structure de données par son interface.
  • Savoir distinguer interface et implémentation.
  • Savoir écrire plusieurs implémentations d’une même structure de données.
  • Savoir distinguer des structures par le jeu des méthodes qui les caractérisent.
  • Savoir choisir une structure de données adaptée à la situation à modéliser.

Fiche de cours