NSI · Bac Terminale

Structures lineaires : listes, piles, files

Cours complet, fiche de révision, QCM corrigés et exercices types sur Structures lineaires : listes, piles, files en NSI. Programme officiel BO 2024, validé par des profs certifiés.

Cours complet
BO 2024
Fiche révision
Synthèse 1 page
QCM corrigé
Auto-évaluation
Prof IA
24h/24

Cours complet : Structures lineaires : listes, piles, files

Les structures de donnees linéaires sont des collections ordonnees d'éléments ou chaque élément possede au plus un predecesseur et un successeur. Elles constituent le socle de la programmation et de l'algorithmique, et leur maitrise est indispensable pour tout informaticien.

Les principales structures linéaires sont les listes chainees, les piles (LIFO - Last In, First Out) et les files (FIFO - First In, First Out). Chacune repond a des besoins specifiques en termes d'acces, d'insertion et de suppression des donnees. Leur choix depend du probleme a résoudre et des contraintes de complexite.

Comprendre ces structures, leurs implementations en Python et leurs complexites algorithmiques est essentiel pour choisir la structure adaptee a un probleme donne. Le concept de type abstrait de donnees (TAD) permet de raisonner sur les opérations independamment de l'implementation concrete, favorisant la modularite et la reutilisabilite du code.

Ce chapitre presente les listes chainees, les piles et les files, en detaillant pour chacune leur interface, leur implementation et leurs applications.

Prérequis

  • Notions de base en Python (classes, listes, boucles)
  • Concept de reference et de pointeur
  • Notion de complexite algorithmique O(1), O(n)

1. Les listes chainees

Une liste chainee est une structure de donnees ou chaque élément (noeud) contient une valeur et une reference vers l'élément suivant. Contrairement aux tableaux, les éléments ne sont pas stockes de maniere contigue en memoire, ce qui permet des insertions et suppressions efficaces sans decalage d'éléments.

On distingue les listes simplement chainees (chaque noeud pointe vers le suivant) des listes doublement chainees (chaque noeud pointe vers le suivant et le précédent). La liste simplement chainee ne permet le parcours que dans un sens, tandis que la doublement chainee autorise un parcours bidirectionnel au prix d'un surcout memoire.

L'acces a un élément par son indice est en O(n) car il faut parcourir la liste depuis la tete. En revanche, l'insertion en tete est en O(1) puisqu'il suffit de creer un noeud et de le relier a l'ancienne tete. L'insertion en queue est en O(n) sauf si on maintient une reference vers le dernier élément, auquel cas elle passe en O(1).

En Python, les listes natives (list) sont implementees comme des tableaux dynamiques, pas comme des listes chainees. Pour implementer une liste chainee, on utilise une classe Noeud avec un attribut valeur et un attribut suivant. Cette distinction est fondamentale et constitue un piege frequent au BAC.

Méthode — Implementer une liste chainee en Python

  1. définir une classe Noeud avec attributs valeur et suivant (initialise a None)
  2. Creer la liste en chainant les noeuds : tete = Noeud(1, Noeud(2, Noeud(3)))
  3. Parcourir avec une boucle while : courant = tete, avancer avec courant = courant.suivant
  4. Inserer en tete : nouveau = Noeud(val, tete), puis tete = nouveau
  5. vérifier la fin de liste : courant is None (pas courant == None)

Exemple : On considere la liste chainee 3 -> 7 -> 2 -> 9. écrire une fonction Python qui retourne la somme des éléments de la liste.

  1. Identifier le cas de base : Si le noeud courant est None (liste vide ou fin de liste), la somme est 0.
  2. définir le cas recursif : La somme est la valeur du noeud courant plus la somme du reste de la liste.
  3. Implementer en Python : def somme(noeud): if noeud is None: return 0 return noeud.valeur + somme(noeud.suivant)
  4. Tracer l'execution : somme(3) = 3 + somme(7) = 3 + 7 + somme(2) = 3 + 7 + 2 + somme(9) = 3 + 7 + 2 + 9 + somme(None) = 21

⚠️ Attention : La list Python est un tableau dynamique, PAS une liste chainee. Ne pas les confondre au BAC. list[i] est O(1) pour un tableau, O(n) pour une liste chainee.

2. Les piles (LIFO)

Une pile est une structure de donnees linéaire suivant le principe LIFO (Last In, First Out) : le dernier élément ajoute est le premier retire. On peut la comparer a une pile d'assiettes ou seule l'assiette du dessus est accessible.

Les opérations fondamentales d'une pile sont : empiler (push) pour ajouter un élément au sommet, depiler (pop) pour retirer l'élément du sommet, consulter le sommet (peek ou top) sans le retirer, et tester si la pile est vide. Toutes ces opérations sont en O(1), ce qui rend la pile extremement efficace.

Une pile peut etre implementee avec un tableau dynamique (liste Python avec append et pop) ou une liste chainee (insertion et suppression en tete). Les deux implementations offrent des opérations en O(1).

Les piles sont utilisees dans de nombreux contextes fondamentaux : la gestion des appels de fonctions (pile d'execution du processeur), l'evaluation d'expressions arithmetiques en notation postfixee, la verification du parenthesage d'expressions, l'algorithme de parcours en profondeur (DFS) des graphes et arbres, et le mecanisme undo/redo des editeurs. La pile d'appels est un concept central pour comprendre la recursivite.

Méthode — vérifier le parenthesage d'une expression

  1. Creer une pile vide
  2. Parcourir chaque caractere de l'expression
  3. Si c'est une parenthese ouvrante '(' : empiler
  4. Si c'est une parenthese fermante ')' : vérifier que la pile n'est pas vide, puis depiler
  5. A la fin, la pile doit etre vide (autant d'ouvertures que de fermetures)

Exemple : On empile successivement les valeurs 5, 3, 8, 1 dans une pile. On depile deux fois. Quel est l'état de la pile et que valent les éléments depiles ?

  1. Empiler les valeurs : Empiler 5 : pile = [5] Empiler 3 : pile = [5, 3] Empiler 8 : pile = [5, 3, 8] Empiler 1 : pile = [5, 3, 8, 1] (sommet = 1)
  2. Premier depilage : On retire le sommet (LIFO). élément depile = 1. Pile = [5, 3, 8]
  3. Deuxieme depilage : On retire le sommet. élément depile = 8. Pile = [5, 3]

⚠️ Attention : Toujours vérifier est_vide() avant de depiler. Depiler une pile vide provoque une erreur. C'est une erreur classique dans les exercices du BAC.

3. Les files (FIFO)

Une file est une structure de donnees linéaire suivant le principe FIFO (First In, First Out) : le premier élément ajoute est le premier retire. On peut la comparer a une file d'attente dans un magasin : le premier arrive est le premier servi.

Les opérations fondamentales sont : enfiler (enqueue) pour ajouter un élément a l'arriere, defiler (dequeue) pour retirer l'élément a l'avant, consulter l'avant (front) sans le retirer, et tester si la file est vide.

Une implementation naive avec une liste Python utilisant pop(0) pour defiler est en O(n) car il faut decaler tous les éléments restants vers la gauche. On prefere utiliser collections.deque qui offre des opérations en O(1) aux deux extremites grace a une implementation en tableau circulaire doublement chaine.

Les files sont utilisees pour le parcours en largeur (BFS) dans les graphes et les arbres, la gestion des processus dans un systeme d'exploitation (ordonnancement FIFO), les tampons (buffers) en reseau pour gerer les donnees en transit, et les files d'impression. La file est la structure duale de la pile : la ou la pile traite le dernier arrive en priorite, la file traite le premier arrive en priorite.

Méthode — Implementer un parcours en largeur (BFS) avec une file

  1. Creer une file avec deque et enfiler le sommet de depart
  2. Creer un ensemble de sommets visites contenant le depart
  3. Tant que la file n'est pas vide : defiler un sommet
  4. Pour chaque voisin non visite : le marquer visite et l'enfiler
  5. Le parcours visite les sommets par distance croissante au depart

Exemple : On enfile successivement A, B, C, D dans une file. On defile deux fois, puis on enfile E. Quel est l'état de la file ?

  1. Enfiler les éléments : Enfiler A : file = [A] Enfiler B : file = [A, B] Enfiler C : file = [A, B, C] Enfiler D : file = [A, B, C, D] (avant = A)
  2. Defiler deux fois : Premier defilement : A sort (FIFO). File = [B, C, D] Deuxieme defilement : B sort. File = [C, D]
  3. Enfiler E : E est ajoute a l'arriere. File = [C, D, E]

⚠️ Attention : Ne JAMAIS utiliser list.pop(0) pour implementer une file : c'est O(n). Toujours utiliser collections.deque avec popleft() pour obtenir O(1).

4. Comparaison et choix de la structure

Le choix entre liste chainee, pile et file depend du probleme a résoudre. La pile est adaptee quand on doit traiter le dernier élément ajoute en priorite (LIFO) : parcours en profondeur, verification de parenthesage, pile d'appels. La file convient quand on traite les éléments dans leur ordre d'arrivee (FIFO) : parcours en largeur, ordonnancement, buffers.

En termes de complexite, les piles et files offrent des opérations principales en O(1). Les listes chainees offrent une insertion en tete en O(1) mais un acces par indice en O(n). Les tableaux (listes Python) offrent un acces par indice en O(1) mais une insertion en debut en O(n) a cause du decalage des éléments.

Les listes doublement chainees combinent les avantages : insertion et suppression en O(1) en tete et en queue, mais au prix d'une consommation memoire supplementaire (deux references par noeud au lieu d'une). C'est la structure sous-jacente de collections.deque en Python.

Il est essentiel de maitriser l'interface (les opérations abstraites) independamment de l'implementation. Le concept de type abstrait de donnees (TAD) separe la specification des opérations de leur realisation concrete. Ainsi, on peut définir le TAD Pile par ses opérations (empiler, depiler, est_vide, sommet) sans preciser si l'implementation utilise un tableau ou une liste chainee.

Méthode — Choisir la bonne structure de donnees

  1. Identifier le mode d'acces : sequentiel, par indice, dernier/premier ajoute
  2. Si besoin de LIFO (dernier ajoute = premier traite) : choisir une pile
  3. Si besoin de FIFO (premier ajoute = premier traite) : choisir une file
  4. Si besoin d'acces par indice en O(1) : choisir un tableau
  5. Si insertions/suppressions frequentes en tete : choisir une liste chainee
  6. définir le TAD avec les opérations necessaires avant de choisir l'implementation

Exemple : On doit gerer une liste d'attente ou le premier inscrit est le premier servi, avec possibilite d'ajouter des personnes et de retirer la prochaine personne. Quelle structure choisir et pourquoi ?

  1. Identifier le mode d'acces : Premier inscrit = premier servi : c'est le principe FIFO.
  2. Choisir la structure : Le principe FIFO correspond a une file. Les opérations necessaires sont enfiler (ajouter une personne) et defiler (retirer la prochaine personne).
  3. Choisir l'implementation : En Python, utiliser collections.deque pour des opérations en O(1). Pas une list avec pop(0) qui serait en O(n).

⚠️ Attention : Ne pas confondre le TAD (interface abstraite) et l'implementation (code concret). Un TAD Pile peut etre implemente avec un tableau OU une liste chainee, les deux sont corrects.

Conclusion

Les structures linéaires (listes chainees, piles, files) sont fondamentales en informatique. Leur maitrise implique de comprendre leurs principes (LIFO, FIFO), leurs complexites algorithmiques et leurs cas d'utilisation. Le concept de type abstrait de donnees permet de raisonner sur les opérations independamment de l'implementation. Au BAC, il est essentiel de savoir choisir et justifier la structure adaptee a chaque probleme.

Mots-clés

liste chaineepilefileLIFOFIFOtype abstraitcomplexitenoeudempilerdefilerdequeTAD

Fiche de révision : Structures lineaires : listes, piles, files

Notions clés

Liste chainee
Structure ou chaque noeud contient une valeur et une reference vers le noeud suivant.
Exemple : Noeud(1, Noeud(2, Noeud(3))) forme la liste 1 -> 2 -> 3.
Pile (LIFO)
Structure ou le dernier élément entre est le premier sorti. opérations : empiler, depiler, sommet.
Exemple : Verification du parenthesage d'une expression mathématique.
File (FIFO)
Structure ou le premier élément entre est le premier sorti. opérations : enfiler, defiler.
Exemple : Parcours en largeur (BFS) d'un graphe.
Type abstrait de donnees
Specification des opérations d'une structure independamment de son implementation.
Exemple : Le TAD Pile définit empiler, depiler, est_vide sans preciser si on utilise un tableau ou une liste chainee.

Formules essentielles

Complexite insertion tete liste chainee : O(1)Conditions : Creation d'un noeud et mise a jour de la reference tete
Complexite acces par indice liste chainee : O(n)Conditions : Parcours sequentiel depuis la tete
Complexite opérations pile : O(1) pour empiler, depiler, sommetConditions : Implementation par tableau ou liste chainee
Complexite opérations file (deque) : O(1) pour enfiler, defilerConditions : Utilisation de collections.deque
Complexite pop(0) sur list Python : O(n)Conditions : Decalage de tous les éléments

Méthodes types

Implementer une pile avec une liste Python

  1. Creer une classe Pile avec self.éléments = []
  2. empiler : self.éléments.append(val)
  3. depiler : return self.éléments.pop()
  4. est_vide : return len(self.éléments) == 0
  5. sommet : return self.éléments[-1]

Implementer une file avec deque

  1. from collections import deque
  2. Creer une classe File avec self.éléments = deque()
  3. enfiler : self.éléments.append(val)
  4. defiler : return self.éléments.popleft()
  5. est_vide : return len(self.éléments) == 0

Parcourir une liste chainee

  1. Initialiser courant = tete
  2. Tant que courant is not None
  3. Traiter courant.valeur
  4. Avancer : courant = courant.suivant

Pièges fréquents à éviter

  • Ne pas confondre la list Python (tableau dynamique) avec une liste chainee.
  • Utiliser pop(0) sur une liste Python pour simuler une file est en O(n) : toujours preferer collections.deque.
  • Une pile vide ne peut pas etre depilee : toujours vérifier est_vide() avant depiler().
  • LIFO = pile (dernier entre, premier sorti), FIFO = file (premier entre, premier sorti).
  • Ne pas confondre TAD (interface) et implementation (code concret).

QCM gratuit (3 questions sur 20+)

1. Quel est le principe d'une pile ?

2. Quel est le principe d'une file ?

3. Quelle est la complexite de l'acces a un élément par indice dans une liste chainee ?

Inscris-toi pour voir les 20+ questions du QCM et les corrections détaillées.

S'inscrire

Comment réviser efficacement ce chapitre ?

  1. 1
    Étape 1 — Lire le cours45 min

    Parcours le cours complet de Structures lineaires : listes, piles, files en prenant des notes synthétiques. Identifie 5-10 notions clés.

  2. 2
    Étape 2 — Construire la fiche45 min

    Résume sur 1 page : définitions, formules, schémas et exemples-clés.

  3. 3
    Étape 3 — Tester ta compréhension30 min

    Fais le QCM intégral (20+ questions) et identifie les notions encore floues.

  4. 4
    Étape 4 — Annales en conditions réelles1h30

    Refais 2-3 exercices types Bac chronométrés pour maîtriser la rédaction attendue.

Questions fréquentes sur Structures lineaires : listes, piles, files

Comment réviser efficacement Structures lineaires : listes, piles, files en NSI ?

Pour bien maîtriser Structures lineaires : listes, piles, files, suis cette méthode en 4 étapes : (1) lis le cours complet en prenant des notes synthétiques, (2) résume sur 1 page en isolant les notions clés et formules, (3) entraîne-toi sur 10-15 QCM corrigés pour vérifier ta compréhension, (4) refais 1-2 exercices types Bac en conditions chronométrées. FlashBac propose pour ce chapitre les 4 ressources dans une interface unifiée.

Quelles sont les notions essentielles de Structures lineaires : listes, piles, files ?

Les notions clés de Structures lineaires : listes, piles, files sont définies par le programme officiel BO 2024 de NSI. Notre cours FlashBac suit fidèlement les attendus du Bulletin Officiel et a été relu par des professeurs certifiés ou agrégés en exercice. Tu retrouves la liste précise des notions dans le sommaire du cours et dans la fiche de révision synthétique.

Structures lineaires : listes, piles, files peut-il tomber au Bac 2026 ?

Oui, Structures lineaires : listes, piles, files fait partie du programme officiel NSI pour le Bac 2026. C'est l'un des chapitres pouvant être évalué dans les épreuves de spécialité (Bac) ou les épreuves finales (Brevet). Refais les annales des 3-5 dernières années pour identifier les types de questions classiques sur ce chapitre.

Combien de temps faut-il pour maîtriser Structures lineaires : listes, piles, files ?

Compte en moyenne 4 à 6 heures de travail pour maîtriser un chapitre comme Structures lineaires : listes, piles, files : 1h pour la lecture du cours, 1h pour la fiche de révision, 2-3h pour les exercices et QCM. Si tu utilises les Profs IA FlashBac, tu peux poser des questions ciblées et accélérer considérablement la compréhension.

Comment FlashBac t'aide à réviser Structures lineaires : listes, piles, files ?

Sur FlashBac, tu accèdes pour Structures lineaires : listes, piles, files : (1) le cours complet conforme BO 2024, (2) une fiche de révision synthétique imprimable, (3) un QCM corrigé avec explications détaillées, (4) des exercices types Bac avec corrigés étape par étape, (5) des flashcards de mémorisation espacée, (6) un Prof IA spécialisé en NSI disponible 24/7. Inscription gratuite pour 1 matière, plan Premium 10,99 €/mois (ou 99€/an, 3 mois offerts) avec accès complet.

Tu as lu le cours — passe à la pratique

Le cours et la fiche sont en accès libre. Mais lire ne suffit pas à retenir : pour ancrer Structures lineaires : listes, piles, files, entraîne-toi avec le QCM corrigé complet, les exercices types, les flashcards de mémorisation et ton Prof IA spécialisé (24h/24). Inscription gratuite ; Premium 10,99 €/mois (ou 99€/an, 3 mois offerts) pour tout débloquer.

Chapitre suivant
Dictionnaires et tables de hachage

Autres chapitres de NSI

Ressources complémentaires