NSI Terminale — programme officiel

Structures de données : listes, piles, files et dictionnaires : fiche de révision

Interface contre implémentation, listes chaînées, piles LIFO, files FIFO, dictionnaires et tables de hachage : la fiche complète avec le code Python et les complexités attendues au bac.

Génère ta fiche depuis TON coursFiches, flashcards et QCM générés par IA — gratuit

1Interface et implémentation : la distinction fondatrice

Une structure de données abstraite se définit par son interface : l'ensemble des opérations qu'elle offre (ajouter, retirer, tester si vide…) et leur comportement, indépendamment de la façon dont elles sont programmées. L'implémentation est le choix concret (tableau, cellules chaînées, classe Python) qui réalise cette interface. Le programme insiste sur cette séparation : on peut changer d'implémentation sans changer le code qui utilise la structure.

En Python, la liste native (type list) est un tableau dynamique : accès par indice en O(1), ajout en fin (append) en O(1) amorti, mais insertion ou suppression en tête en O(n) car tous les éléments sont décalés. Cette propriété conditionne le choix de structure pour chaque usage.

2Listes chaînées, piles et files

Une liste chaînée est une suite de cellules, chacune contenant une valeur et une référence vers la cellule suivante (None pour la dernière). Insérer en tête est en O(1), accéder au k-ième élément est en O(k). Implémentation minimale :

class Cellule:

def __init__(self, valeur, suivante=None): self.valeur = valeur ; self.suivante = suivante

Une pile (stack) suit la règle LIFO — Last In, First Out : le dernier élément empilé est le premier dépilé. Interface : empiler (push), dépiler (pop), est_vide, sommet. Usages : évaluation d'expressions, vérification de parenthésage, pile d'appels des fonctions récursives, parcours en profondeur. Avec une liste Python, append et pop() en fin de liste donnent une pile en O(1).

Une file (queue) suit la règle FIFO — First In, First Out : premier arrivé, premier servi. Interface : enfiler (enqueue), défiler (dequeue), est_vide. Usages : parcours en largeur d'un graphe, files d'attente, ordonnancement. Avec une liste Python, pop(0) est en O(n) : on préfère collections.deque (popleft en O(1)) ou une implémentation à deux piles.

3Dictionnaires et tables de hachage

Un dictionnaire associe des clés à des valeurs (paires clé/valeur). En Python, d[cle] = valeur, d[cle], cle in d, del d[cle], d.keys(), d.values(), d.items(). Les clés doivent être immuables (int, str, tuple), pas des listes.

L'implémentation par table de hachage explique son efficacité : une fonction de hachage transforme la clé en un indice de tableau, ce qui donne un accès, une insertion et une suppression en O(1) en moyenne. Les collisions (deux clés, même indice) sont gérées par chaînage ou adressage ouvert ; dans le pire cas, tout dégénère en O(n), mais ce cas est rarissime avec une bonne fonction de hachage.

Comparaison décisive au bac : chercher si un élément est dans une liste Python (x in liste) est en O(n) ; dans un dictionnaire ou un ensemble (set), c'est en O(1) en moyenne. Compter les occurrences des mots d'un texte, mémoriser des résultats (mémoïsation) ou indexer des données se font donc avec un dictionnaire.

4Exercice type et pièges classiques

Énoncé type : vérifier qu'une expression est bien parenthésée. Solution avec une pile : on parcourt les caractères ; une parenthèse ouvrante est empilée ; une fermante dépile (si la pile est vide, l'expression est incorrecte) ; à la fin, l'expression est correcte si et seulement si la pile est vide.

def bien_parenthesee(s):

pile = []

for c in s:

if c == '(': pile.append(c)

elif c == ')':

if len(pile) == 0: return False

pile.pop()

return len(pile) == 0

Pièges : confondre LIFO et FIFO dans l'énoncé ; utiliser pop(0) pour une file sans signaler la complexité O(n) ; utiliser une liste comme clé de dictionnaire (TypeError : unhashable) ; oublier que la longueur d'une liste chaînée nécessite un parcours O(n) si elle n'est pas mémorisée. À l'épreuve pratique, on demande souvent d'implémenter une pile ou une file par une classe avec les méthodes de l'interface.

Définitions à connaître par cœur

Interface
Ensemble des opérations offertes par une structure de données et leur comportement, indépendamment de l'implémentation.
Pile (LIFO)
Structure où le dernier élément ajouté est le premier retiré (Last In, First Out) : opérations empiler, dépiler, est_vide.
File (FIFO)
Structure où le premier élément ajouté est le premier retiré (First In, First Out) : opérations enfiler, défiler, est_vide.
Liste chaînée
Suite de cellules contenant chacune une valeur et une référence vers la cellule suivante ; insertion en tête en O(1).
Table de hachage
Implémentation des dictionnaires : une fonction de hachage transforme la clé en indice, donnant un accès en O(1) en moyenne.
Collision
Situation où deux clés distinctes reçoivent le même indice de hachage ; gérée par chaînage ou adressage ouvert.

Quiz : teste-toi sur structures de données : listes, piles, files et dictionnaires

8 questions corrigées. Réponds avant d'ouvrir la correction !

1. Quelle structure suit la règle LIFO ?

  • A.La file
  • B.La pile
  • C.Le dictionnaire
  • D.La liste chaînée
Voir la réponse

Réponse : B. La pile

LIFO (Last In, First Out) définit la pile : le dernier élément empilé est le premier dépilé.

2. Quelle est la complexité de l'insertion en tête d'une liste chaînée ?

  • A.O(1)
  • B.O(log n)
  • C.O(n)
  • D.O(n²)
Voir la réponse

Réponse : A. O(1)

Il suffit de créer une cellule pointant vers l'ancienne tête : temps constant, quelle que soit la longueur.

3. Dans une liste Python de n éléments, le test « x in liste » est en moyenne en…

  • A.O(1)
  • B.O(log n)
  • C.O(n)
  • D.O(n log n)
Voir la réponse

Réponse : C. O(n)

Python parcourt la liste élément par élément ; dans un dictionnaire ou un set, le même test est en O(1) en moyenne.

4. Pourquoi une liste Python ne peut-elle pas servir de clé de dictionnaire ?

  • A.Parce qu'elle est trop longue
  • B.Parce qu'elle est mutable, donc non hachable
  • C.Parce que Python n'accepte que des entiers comme clés
  • D.Parce que les clés doivent être des chaînes
Voir la réponse

Réponse : B. Parce qu'elle est mutable, donc non hachable

Les clés doivent être immuables (int, str, tuple) pour que leur hachage reste stable ; une liste mutable lève TypeError.

5. Quelle opération est en O(n) sur une liste Python ?

  • A.append(x)
  • B.pop()
  • C.pop(0)
  • D.L[i]
Voir la réponse

Réponse : C. pop(0)

Retirer le premier élément décale tous les autres ; c'est pourquoi une file s'implémente avec collections.deque.

6. Quel parcours de graphe utilise naturellement une file ?

  • A.Le parcours en profondeur
  • B.Le parcours en largeur
  • C.Le tri topologique
  • D.La recherche dichotomique
Voir la réponse

Réponse : B. Le parcours en largeur

Le parcours en largeur (BFS) traite les sommets dans l'ordre de découverte : premier découvert, premier traité — une file FIFO.

7. Que se passe-t-il en cas de collision dans une table de hachage ?

  • A.La clé est refusée
  • B.La table est reconstruite entièrement
  • C.Les deux clés sont stockées au même indice, par chaînage ou adressage ouvert
  • D.La valeur la plus ancienne est écrasée
Voir la réponse

Réponse : C. Les deux clés sont stockées au même indice, par chaînage ou adressage ouvert

Une collision est normale et gérée : plusieurs paires peuvent cohabiter au même indice (liste chaînée) ou être déplacées.

8. Dans l'algorithme de vérification du parenthésage avec une pile, l'expression est correcte si…

  • A.la pile contient exactement une parenthèse à la fin
  • B.on n'a jamais dépilé
  • C.la pile est vide à la fin et n'a jamais été dépilée à vide
  • D.le nombre de parenthèses est pair
Voir la réponse

Réponse : C. la pile est vide à la fin et n'a jamais été dépilée à vide

Un « ) » sur pile vide ou une pile non vide à la fin signalent une erreur ; « )( » a un nombre pair de parenthèses mais est incorrect.

Envie de QCM générés depuis ton propre cours ?

Créer mes QCM gratuitement

Questions fréquentes

Quelle est la différence entre une pile et une file ?

La pile fonctionne en LIFO (le dernier entré sort en premier, comme une pile d'assiettes) ; la file fonctionne en FIFO (le premier entré sort en premier, comme une file d'attente). Elles partagent des opérations analogues mais un ordre de sortie opposé.

Pourquoi utiliser une liste chaînée plutôt qu'un tableau ?

Pour insérer ou supprimer en tête en temps constant, sans décaler les éléments. En contrepartie, l'accès au k-ième élément coûte O(k) au lieu de O(1) dans un tableau.

Comment implémenter une file efficace en Python ?

Avec collections.deque (append à droite, popleft à gauche en O(1)) ou avec deux piles : on empile les arrivées dans la première et on renverse dans la seconde au moment de défiler.

Que demande l'épreuve pratique sur ce chapitre ?

Typiquement : écrire une classe Pile ou File avec ses méthodes, compter des occurrences avec un dictionnaire, ou compléter une fonction qui manipule une liste chaînée. Les complexités peuvent être demandées en justification.