<?xml version="1.0" encoding="UTF-8"?>
<quiz>
<question type="category">
  <category>
    <text>$course$/QCM de NSI/Terminale/Listes, piles, files</text>
  </category>
  <info format="html">
    <text><![CDATA[<p>Structures de données linéaires : listes chaînées, piles<br/>
(LIFO) et files (FIFO). Opérations de base, complexité,<br/>
implémentations possibles, applications classiques (parcours,<br/>
parenthésage, parcours en largeur, etc.).</p>]]></text>
  </info>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q01 : Définition d'une pile</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel est le principe d'une <strong>pile</strong> (<em>stack</em>) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Les piles sont fondamentales en informatique : pile<br/>
d'appels de fonctions, gestion d'historique (Ctrl+Z),<br/>
analyse syntaxique de parenthèses, parcours en<br/>
profondeur d'un graphe.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Tri automatique des éléments</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun tri. Les éléments sont stockés dans<br/>
leur ordre d'arrivée, accessible uniquement par<br/>
le sommet.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Premier entré, premier sorti (FIFO)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est le principe d'une <strong>file</strong> (queue),<br/>
pas d'une pile. Confusion classique entre les deux.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Accès aléatoire à n'importe quel élément</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait un tableau classique. Une pile<br/>
impose un accès uniquement par le sommet.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Dernier entré, premier sorti (LIFO)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : LIFO (<em>Last In, First Out</em>). On<br/>
ajoute (push) et on retire (pop) toujours par le<br/>
<strong>sommet</strong>. C'est le comportement d'une pile<br/>
d'assiettes : on prend toujours celle du haut.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q02 : Définition d'une file</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel est le principe d'une <strong>file</strong> (<em>queue</em>) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Les files sont utilisées pour : tâches en attente<br/>
(imprimante, ordonnanceur), parcours en largeur d'un graphe,<br/>
buffers de communication, et tout système où l'on<br/>
veut respecter l'ordre d'arrivée.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Élimination automatique des doublons</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucune dédoublonnage automatique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Dernier entré, premier sorti (LIFO)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est le principe d'une <strong>pile</strong>, pas<br/>
d'une file.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Premier entré, premier sorti (FIFO)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : FIFO (<em>First In, First Out</em>). On<br/>
ajoute en queue (enfilement) et on retire en tête<br/>
(défilement). C'est le comportement d'une file<br/>
d'attente au supermarché.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Accès direct au milieu de la structure</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la file impose l'accès uniquement aux<br/>
extrémités.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q03 : Opérations sur une pile</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelles sont les <strong>deux opérations principales</strong> d'une<br/>
pile ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Toutes ces opérations s'effectuent en temps <strong>constant</strong><br/>
O(1) avec une bonne implémentation. C'est l'avantage<br/>
principal des piles et files par rapport aux<br/>
structures plus complexes.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>push et pop</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : push(x) (empiler) ajoute x au<br/>
sommet ; pop() (dépiler) retire et renvoie<br/>
l'élément du sommet. On a aussi souvent peek()<br/>
ou top() (consulter sans retirer) et<br/>
is_empty() (tester la vacuité).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>lire(i) et ecrire(i, x)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce sont des opérations d'accès indexé,<br/>
propres à un tableau ; une pile n'accède qu'à son<br/>
sommet.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>enqueue et dequeue</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce sont les opérations d'une <strong>file</strong>,<br/>
pas d'une pile.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>add et remove</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ces noms sont génériques. Les noms<br/>
standard sur une pile sont plus spécifiques.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q04 : Opérations sur une file</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelles sont les opérations principales d'une <strong>file</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Les noms varient selon les langages et les ouvrages : enfiler et defiler en français, enqueue et dequeue en anglais. Le concept reste le même.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>push et pop</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce sont les opérations d'une <strong>pile</strong>,<br/>
pas d'une file.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>sort et reverse (listes)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : opérations sur les listes, pas sur les<br/>
files.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>min et max</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce sont des opérations d'agrégation, pas<br/>
de file.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>enqueue et dequeue</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : enqueue(x) ajoute x à la queue ;<br/>
dequeue() retire et renvoie l'élément en tête.<br/>
Comme pour la pile, ces opérations sont en O(1).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q05 : Application classique des piles</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour vérifier qu'une expression contient des<br/>
<strong>parenthèses bien équilibrées</strong> (par exemple<br/>
((a + b) * c)), quelle structure est la plus adaptée ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cet exemple illustre bien le LIFO : la dernière<br/>
parenthèse ouverte est celle qui doit être fermée en<br/>
premier. L'algorithme s'étend aux crochets [],<br/>
accolades {}, balises HTML, etc.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une file (FIFO)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la file ne convient pas. Pour<br/>
l'équilibrage, on a besoin d'accéder à la<br/>
parenthèse ouvrante la plus récente, ce qui est<br/>
du LIFO.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un tableau trié</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun rapport avec un tri. C'est l'ordre<br/>
d'apparition qui compte, ce qui est une pile.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un dictionnaire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le dictionnaire n'est pas adapté à un<br/>
ordre temporel. La pile est la bonne structure.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Une pile (LIFO)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on empile les parenthèses<br/>
ouvrantes ; à chaque parenthèse fermante, on<br/>
dépile et on vérifie la correspondance. À la fin,<br/>
la pile doit être vide. C'est l'algorithme<br/>
standard.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q06 : Application classique des files</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour gérer une <strong>file d'impression</strong> (les documents<br/>
arrivés en premier sont imprimés en premier), quelle<br/>
structure utiliser ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>D'autres situations relèvent de la file : clients servis à un guichet, processus en attente du processeur, paquets en attente dans un routeur.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une pile</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : avec une pile, le dernier document arrivé<br/>
serait imprimé en premier, ce qui est injuste.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un dictionnaire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas de notion d'ordre temporel naturelle<br/>
dans un dictionnaire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une liste triée par taille</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : trier par taille fausserait l'ordre<br/>
d'arrivée. Sauf si on veut une politique<br/>
spécifique (le plus petit d'abord), mais ce n'est<br/>
pas FIFO.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Une file</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la file (FIFO) garantit que<br/>
l'ordre d'arrivée est respecté. C'est exactement<br/>
l'usage typique : ordonnanceur du système<br/>
d'exploitation, file d'impression, tampon<br/>
réseau.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q07 : Pile en Python</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>En Python, une manière simple d'implémenter une pile<br/>
utilise :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour une pile « propre », on préférera implémenter une<br/>
classe Pile avec méthodes empiler, depiler,<br/>
est_vide, etc. Cela cache la liste sous-jacente et<br/>
empêche les usages aberrants (accès indexé direct).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Une liste avec append() et pop()</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : lst.append(x) ajoute en fin<br/>
(sommet) et lst.pop() retire la fin (sommet),<br/>
tous deux en O(1) amorti. Simple et efficace.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une simple chaîne de caractères mutable</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les chaînes sont immuables en Python.<br/>
Empiler créerait une nouvelle chaîne à chaque<br/>
opération, c'est inefficace.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un simple entier</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un entier est une valeur<br/>
unique : il ne peut pas<br/>
contenir une suite<br/>
d'éléments empilés<br/>
successivement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un dictionnaire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le dictionnaire n'a pas de notion d'ordre<br/>
en place pour cet usage.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q08 : Implémenter une file rapide en Python</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On veut implémenter en Python une file dont les opérations enfiler et defiler restent rapides, même avec un très grand nombre d'éléments. Quelle implémentation convient ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une file s'implémente classiquement avec un tableau ou avec deux piles. Les deux piles évitent tout décalage : chaque élément est empilé une fois, déversé une fois et dépilé une fois.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une seule liste, avec append pour enfiler et pop(0) pour défiler</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pop(0) retire le premier élément et oblige à décaler tous les autres d'une case, ce qui coûte un temps proportionnel à la taille de la file à chaque défilement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une seule liste, avec insert(0, x) pour enfiler et pop() pour défiler</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : insert(0, x) place l'élément au début de la liste et décale tous les autres, ce qui coûte un temps proportionnel à la taille de la file à chaque enfilement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un p-uplet, reconstruit avec + à chaque enfilement et chaque défilement</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un p-uplet ne se modifie pas. Chaque opération fabrique un nouveau p-uplet en recopiant tous les éléments, ce qui coûte un temps proportionnel à la taille de la file.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Deux listes utilisées comme piles : une d'entrée, une de sortie</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on empile en entrée avec append et on dépile en sortie avec pop(). Quand la pile de sortie est vide, on y déverse la pile d'entrée, ce qui remet les éléments dans l'ordre d'arrivée. Chaque élément n'est déplacé qu'une fois, si bien que le coût moyen par opération reste constant.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q09 : Pile d'appels</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel rôle joue la <strong>pile d'appels</strong> (<em>call stack</em>) lors<br/>
de l'exécution d'un programme ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>C'est précisément la pile d'appels qui sature en cas<br/>
de récursion infinie, provoquant le célèbre<br/>
RecursionError ou <em>stack overflow</em>. Sa taille est<br/>
typiquement limitée à quelques dizaines de milliers<br/>
d'appels.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Stocker les fichiers ouverts</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les fichiers sont gérés par le système<br/>
d'exploitation, pas par la pile d'appels.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Empiler le contexte de chaque appel de fonction</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est exactement le rôle d'une<br/>
pile au sens LIFO. Quand une fonction A appelle B,<br/>
le contexte de A reste empilé sous celui de B,<br/>
jusqu'à ce que B se termine et qu'on dépile pour<br/>
revenir à A.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Compter les variables globales</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun rapport. La pile d'appels gère les<br/>
contextes locaux.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Stocker les données complètes d'une base de données</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Une base de données est<br/>
stockée sur le disque<br/>
dans des structures<br/>
dédiées, sans rapport<br/>
avec la pile d'appels<br/>
gérée par<br/>
l'interpréteur.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q10 : Liste chaînée</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'est-ce qu'une <strong>liste chaînée</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Variantes : listes <strong>simplement chaînées</strong> (un seul<br/>
pointeur next), <strong>doublement chaînées</strong> (next et<br/>
previous), <strong>circulaires</strong> (le dernier pointe vers le<br/>
premier). Chaque variante a ses cas d'usage.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une liste reliée à une base de données</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun rapport avec une base de données.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une liste chiffrée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : « chaînée » et « chiffrée » sont des<br/>
mots différents. Aucun rapport avec la<br/>
cryptographie.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une liste qui ne peut pas être modifiée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait une liste immuable. Une liste<br/>
chaînée peut tout à fait être modifiée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Des maillons reliant chaque valeur au suivant</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : contrairement à un tableau (mémoire<br/>
contiguë), une liste chaînée est composée de<br/>
maillons qui se référencent. Ajouter ou supprimer<br/>
en tête se fait en O(1), mais l'accès indexé<br/>
coûte O(n).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q11 : Complexité des opérations sur une pile</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la complexité des opérations push et pop<br/>
sur une pile, pour une bonne implémentation ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Avec une liste Python, append et pop() (sans<br/>
argument) sont en O(1) amorti. Avec une liste<br/>
chaînée et un pointeur sur le sommet, c'est aussi<br/>
O(1). Pas de surprise.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(n²) pour les deux</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : excessif.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(n) pour les deux</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est trop coûteux. Les piles sont<br/>
réputées efficaces parce que ces opérations sont<br/>
en temps constant.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(\log n) pour les deux</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas de raison logarithmique. C'est un<br/>
accès direct.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>O(1) pour les deux</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : push et pop agissent toujours<br/>
au sommet, donc en temps constant. C'est ce qui<br/>
rend les piles si utiles dans les algorithmes<br/>
comme la conversion infixe → postfixe ou le parcours en profondeur.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q12 : Accès indexé dans une liste chaînée</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la complexité d'accéder au k-ième élément<br/>
d'une liste chaînée simplement chaînée ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>C'est le compromis fondamental : une liste chaînée<br/>
offre des insertions/suppressions efficaces (O(1)<br/>
en tête, O(n) ailleurs), mais un accès indexé lent.<br/>
Pour un accès rapide, utiliser un tableau.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>O(k)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : il faut suivre les pointeurs un<br/>
par un depuis la tête. Pour atteindre l'élément<br/>
k, il faut k étapes : le coût est linéaire<br/>
en k.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(\log k)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas de division par deux possible. C'est<br/>
plutôt linéaire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(1)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les listes chaînées <strong>n'offrent pas</strong><br/>
d'accès indexé en temps constant, contrairement<br/>
aux tableaux. Il faut parcourir.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(k²)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : excessif.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q13 : Évaluation d'une expression postfixée</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>L'évaluation d'une expression en <strong>notation postfixée</strong><br/>
(par exemple 2 3 + 4 *) utilise :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cette technique évite la gestion explicite des parenthèses : l'ordre d'écriture fixe à lui seul l'ordre des calculs.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Une pile</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on empile chaque opérande et l'on<br/>
dépile à chaque opérateur. Pour 2 3 + 4 <em>, on empile 2,<br/>
puis 3 ; on rencontre +, on dépile 3 et 2,<br/>
on calcule 5, on empile 5 ; on empile 4 ;<br/>
on rencontre </em>, on dépile 4 et 5, on calcule<br/>
20. Résultat : 20.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un arbre binaire de syntaxe</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on peut <strong>représenter</strong> une expression par<br/>
un arbre, mais l'évaluation postfixée utilise une<br/>
pile.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un dictionnaire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le dictionnaire associe<br/>
des clés à des valeurs ;<br/>
il ne reflète pas l'ordre<br/>
temporel d'arrivée des<br/>
opérandes nécessaire à<br/>
l'évaluation d'une<br/>
expression postfixée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une file</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la file ne fonctionne pas pour ce cas. La<br/>
notation postfixée demande d'accéder aux deux<br/>
derniers opérandes, ce qui est typiquement LIFO.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q15 : Distinction entre interface et implémentation</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>« Pile » et « file » sont des <strong>interfaces</strong> abstraites.<br/>
Cela signifie que :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>C'est l'idée des <strong>types abstraits de données</strong><br/>
(TAD) : on spécifie ce que la structure <strong>doit faire</strong>, pas comment. Une pile peut être implémentée<br/>
de plusieurs façons, l'utilisateur du TAD ne s'en<br/>
soucie pas.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Elles sont écrites en assembleur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun rapport avec le langage.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Elles sont obsolètes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : elles sont au contraire fondamentales et<br/>
omniprésentes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Elles définissent le comportement, pas la structure</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on peut implémenter une pile avec<br/>
une liste Python, une liste chaînée, un tableau,<br/>
etc. Tant que les opérations respectent LIFO,<br/>
c'est une pile. Cette abstraction est essentielle<br/>
en programmation modulaire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Elles ne peuvent pas du tout être implémentées en Python</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : Python permet bien sûr d'implémenter ces<br/>
structures.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q16 : Pile vide</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que faut-il faire avant de tenter un pop() sur une<br/>
pile ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Bonne pratique : dans une classe Pile, proposer une méthode est_vide que l'utilisateur appelle avant de dépiler, ou vérifier la condition au début de depiler avec un assert explicite.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Multiplier la taille par deux</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun rapport. Aucune opération de<br/>
redimensionnement n'est nécessaire avant un pop.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Recalculer la longueur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas de calcul à faire avant un pop.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Vérifier qu'elle n'est pas vide</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : un pop sur pile vide provoque<br/>
en général une erreur (IndexError en Python). Il<br/>
faut toujours vérifier d'abord, ou capturer<br/>
l'exception.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Toujours appeler peek() d'abord</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : peek() consulte mais ne protège pas<br/>
d'un pop sur une pile vide.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q17 : Liste chaînée vs tableau</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel est l'<strong>avantage principal</strong> d'une liste chaînée<br/>
sur un tableau dynamique ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Compromis classique : tableau pour l'accès indexé<br/>
rapide ; liste chaînée pour les insertions/suppressions<br/>
fréquentes en début ou milieu (avec un pointeur sur<br/>
l'emplacement).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>L'accès indexé est plus rapide</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est l'inverse. Le tableau a un accès<br/>
O(1), la liste chaînée O(n).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Elle utilise moins de mémoire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est l'inverse, en général. Une liste<br/>
chaînée stocke un pointeur supplémentaire par<br/>
élément, ce qui consomme plus de mémoire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Insertion en tête en temps constant</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est l'avantage clé. Avec un<br/>
tableau, insérer en tête demande de décaler tous<br/>
les éléments. Avec une liste chaînée, on<br/>
modifie juste un pointeur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Elle est intrinsèquement toujours triée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun tri automatique.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q18 : Implémentation orientée objet d'une pile</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>En Python, dans une classe Pile minimale, quelles<br/>
méthodes définit-on typiquement ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L'utilisateur ne manipule que les méthodes de la pile, jamais la liste qui la stocke : c'est ce qui distingue une pile, accessible par son seul sommet, d'un tableau libre.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>empiler, depiler, est_vide</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : ces trois méthodes forment le cœur de l'interface d'une pile. On y ajoute souvent sommet(), qui consulte sans dépiler, ou taille().</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>lire(i), ecrire(i, x), taille</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : lire ou écrire à un indice<br/>
quelconque, ce serait un tableau, pas une<br/>
pile, qui n'est accessible que par son<br/>
sommet.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>add, remove, find, sort</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ces méthodes ne correspondent pas à<br/>
l'API d'une pile. Une pile n'offre pas de find<br/>
ou sort.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une seule méthode do(action, x)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : trop minimaliste. Une pile expose<br/>
plusieurs opérations distinctes, chacune avec sa<br/>
propre méthode.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q19 : Détection de parenthèses déséquilibrées</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>L'expression (()) est-elle bien parenthésée ? Et<br/>
(() ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Règle algorithmique : une expression est bien<br/>
parenthésée si et seulement si la pile est vide à la<br/>
fin, ET qu'aucune fermante n'apparaît sur une pile<br/>
vide pendant le parcours.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>(()) et (() sont toutes deux mal parenthésées</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : (()) est parfaitement équilibrée :<br/>
deux parenthèses ouvrantes, deux fermantes, dans<br/>
le bon ordre.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La parité du nombre de caractères suffit à juger</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ()( est de longueur paire mais<br/>
déséquilibré. La parité ne suffit pas.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>(()) et (() sont toutes deux bien parenthésées</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : (() ne ferme pas la première<br/>
parenthèse. Donc déséquilibrée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>(()) est correcte, (() ne l'est pas</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : avec une pile, on empile chaque<br/>
(, on dépile à chaque ). Pour (()), la pile<br/>
est vide à la fin. Pour ((), la pile contient<br/>
encore la première parenthèse, qui n'est jamais<br/>
fermée : l'expression est déséquilibrée.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q20 : Analyse d'un code de pile</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que renvoie le code Python suivant ?</p>
<p>`<code>python<br/>
pile = []<br/>
for x in [1, 2, 3, 4]:<br/>
    pile.append(x)<br/>
print(pile.pop())<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Comportement standard LIFO : dernier entré, premier<br/>
sorti. Si on continuait à pop() plusieurs fois, on<br/>
obtiendrait 4, 3, 2, 1 dans l'ordre.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>4</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on a empilé 1, 2, 3, 4. Le<br/>
sommet est 4. pop() retire et renvoie 4.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>0</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun rapport avec 0.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>1</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est l'élément de <strong>bas</strong> de pile (le<br/>
premier empilé). Mais pop() retire le <strong>sommet</strong><br/>
(le dernier empilé).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste entière [1, 2, 3]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pop() ne retourne qu'un seul élément.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q21 : Pourquoi pas list.pop(0) pour une file</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pourquoi list.pop(0) est-il <strong>inefficace</strong> pour<br/>
implémenter une file en Python ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>C'est un piège classique en Python. Pour une file efficace, on peut par exemple utiliser deux piles, l'une pour enfiler et l'autre pour défiler, ou une liste accompagnée d'un indice qui repère la tête de la file.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que ça lève toujours une erreur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pop(0) fonctionne sur une liste non<br/>
vide. Le problème est la performance, pas la<br/>
correction.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que pop ne peut pas prendre d'argument</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pop(i) accepte un argument optionnel.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que les listes Python ne sont pas mutables</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les listes sont mutables.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Il faut décaler tous les éléments, en O(n)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : les éléments d'une liste Python sont rangés les uns à la suite des autres en mémoire. Retirer le premier élément force à décaler tous les autres d'une case.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q23 : Récursivité et pile</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Toute fonction récursive peut être convertie en une<br/>
version itérative utilisant explicitement :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cette technique de <strong>dérécursivation</strong> est utile<br/>
quand la profondeur de récursion dépasse la limite<br/>
Python (souvent 1000). On remplace les appels par<br/>
des push/pop sur une pile explicite, et on contrôle<br/>
ainsi la mémoire utilisée.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une file</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la récursivité a une nature LIFO (l'appel<br/>
le plus profond est traité en premier). C'est<br/>
donc une pile.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Une pile (la pile d'appels)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est précisément ce que fait le<br/>
processeur en interne. En remplaçant les appels<br/>
récursifs par des opérations sur une pile<br/>
explicite, on transforme une fonction récursive<br/>
en boucle. Cela peut éviter les dépassements de<br/>
pile.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un dictionnaire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un dictionnaire ne préserve pas l'ordre<br/>
d'appels. La structure adaptée est une pile.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un arbre binaire de recherche</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un arbre est une donnée, pas un<br/>
mécanisme d'exécution.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q24 : Chercher par clé ou par valeur dans un dictionnaire</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Le dictionnaire annuaire associe à chaque nom un numéro de téléphone : par exemple, annuaire["Léa"] vaut "0601020304". Il contient 100000 entrées. On effectue deux recherches :</p>
<p>- (A) trouver le numéro de Léa ;<br/>
- (B) trouver le nom de la personne dont le numéro est "0601020304".</p>
<p>Que peut-on dire de leur coût ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Chercher par clé dans un dictionnaire prend un temps constant en moyenne ; chercher une valeur dans une liste, ou parmi les valeurs d'un dictionnaire, demande un parcours de coût linéaire. Pour retrouver rapidement un nom à partir d'un numéro, il faudrait un second dictionnaire dont les numéros sont les clés.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>(B) est quasi immédiate, (A) demande de parcourir les entrées</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : tu inverses les rôles des clés et des valeurs. Ici, les noms sont les clés, ce sont eux qui donnent un accès direct ; les numéros sont les valeurs.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les deux demandent de parcourir les entrées, comme dans une liste</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait le cas si l'annuaire était une liste de couples. Dans un dictionnaire, l'accès par clé annuaire["Léa"] ne parcourt pas les entrées et prend un temps constant en moyenne.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>(A) est quasi immédiate, (B) demande de parcourir les entrées</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : l'accès annuaire["Léa"] prend un temps constant en moyenne, quelle que soit la taille du dictionnaire. Retrouver un nom à partir d'un numéro oblige au contraire à examiner les couples un par un, comme dans une liste.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les deux sont quasi immédiates, car un dictionnaire est indexé</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : seul l'accès par clé est rapide. Rien ne permet d'aller directement à la valeur "0601020304" : il faut parcourir les entrées jusqu'à la trouver.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q25 : Choisir la bonne structure</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On souhaite gérer l'historique des actions d'un éditeur<br/>
de texte, avec une fonction « annuler » (Ctrl+Z). Quelle<br/>
structure est la plus adaptée ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Petit défi : implémenter Ctrl+Z <strong>et</strong> Ctrl+Y. Astuce<br/>
classique : deux piles. Quand on annule, on dépile de<br/>
la pile « historique » et on empile dans la pile<br/>
« refait ». Quand on refait, c'est l'inverse.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une file</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la file annulerait la <strong>première</strong> action,<br/>
pas la dernière. Or « annuler » concerne la plus<br/>
récente.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une liste triée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas de tri à faire ; l'ordre est déjà<br/>
donné par l'arrivée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Une pile</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : à chaque action, on l'empile.<br/>
Ctrl+Z dépile et annule la dernière. C'est le cas<br/>
d'usage typique des piles. Pour le « refaire »<br/>
(Ctrl+Y), on utilise une <strong>deuxième</strong> pile.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un dictionnaire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas de notion temporelle adaptée.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q26 : Maillon d'une liste chaînée</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On souhaite implémenter une liste simplement chaînée<br/>
en Python. Quelle classe représente un <strong>maillon</strong><br/>
correctement ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour parcourir la liste chaînée, on commence par la<br/>
tête et on suit les pointeurs suivant jusqu'à<br/>
atteindre None. La classe Maillon est l'élément<br/>
atomique ; la classe ListeChainee (ou directement<br/>
une variable « tête ») gère la collection.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
class Maillon:<br/>
    def __init__(self, valeur, precedent, suivant):<br/>
        self.valeur = valeur<br/>
        self.precedent = precedent<br/>
        self.suivant = suivant<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on a ici un maillon <strong>doublement chaîné</strong> (avec un pointeur vers le précédent et<br/>
un vers le suivant). C'est utile pour certaines<br/>
structures, mais la question portait sur une<br/>
liste <strong>simplement</strong> chaînée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>`<code>python<br/>
class Maillon:<br/>
    def __init__(self, valeur, suivant=None):<br/>
        self.valeur = valeur<br/>
        self.suivant = suivant<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : un maillon contient sa propre<br/>
valeur et une référence vers le maillon suivant<br/>
(ou None si c'est le dernier). C'est la<br/>
définition canonique. La construction d'une<br/>
liste chaînée se fait ensuite en chaînant<br/>
plusieurs maillons via leur attribut suivant.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
def maillon(valeur):<br/>
    return [valeur]<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on retourne ici une liste Python avec<br/>
un seul élément, ce qui n'est pas un maillon.<br/>
Pour chaîner plusieurs valeurs, il faudrait<br/>
imbriquer des listes, ce qui est lourd et peu<br/>
clair par rapport à une vraie classe.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
class Maillon:<br/>
    def __init__(self, valeur):<br/>
        self.valeur = valeur<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il manque l'attribut suivant. Sans<br/>
lui, le maillon ne peut pas pointer vers le<br/>
suivant et la « chaîne » est cassée. Ce serait<br/>
juste un conteneur de valeur, pas un maillon.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q27 : Parcours en profondeur avec pile explicite</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour effectuer un parcours en profondeur d'un arbre<br/>
ou d'un graphe <strong>sans utiliser la récursivité</strong>, quel<br/>
algorithme et quelle structure utilise-t-on ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Mémoire récurrente :<br/>
- <strong>Pile</strong> + parcours = parcours en <strong>profondeur</strong>.<br/>
- <strong>File</strong> + parcours = parcours en <strong>largeur</strong>.<br/>
Cette dualité s'observe sur les arbres comme sur<br/>
les graphes, et illustre la puissance des<br/>
structures linéaires LIFO/FIFO en algorithmique.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>On trie d'abord les sommets puis on les parcourt<br/>
dans l'ordre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on parle ici d'un parcours qui<br/>
respecte la structure du graphe ou de l'arbre,<br/>
pas d'un parcours par valeur croissante. Trier<br/>
n'a pas de sens dans ce contexte.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>On utilise une file : on enfile le sommet<br/>
de départ et on défile à chaque étape</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : avec une file (FIFO), on obtient un<br/>
parcours en <strong>largeur</strong>, pas en profondeur.<br/>
Le parcours en profondeur explore d'abord<br/>
les descendants avant les frères, ce qui est<br/>
un comportement LIFO.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>On utilise un dictionnaire pour stocker les<br/>
sommets visités</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Réponse partielle : un dictionnaire (ou un<br/>
ensemble) sert effectivement à mémoriser les<br/>
sommets déjà visités, mais ce n'est pas la<br/>
structure qui dirige le parcours. C'est la<br/>
pile (ou la file) qui décide de l'ordre de<br/>
visite.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Une pile : dépiler un sommet, le marquer, empiler ses voisins</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la pile explicite simule<br/>
exactement ce que ferait la récursion via la<br/>
pile d'appels du langage. C'est un cas concret<br/>
de dérécursivation. Avantage : on contrôle la<br/>
mémoire et on évite les RecursionError sur<br/>
les graphes profonds.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q28 : Annuler et refaire avec deux piles</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On veut implémenter une fonctionnalité « annuler »<br/>
(Ctrl+Z) et « refaire » (Ctrl+Y) dans un éditeur.<br/>
Quelle structure utiliser ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Variante avancée : pour gérer un historique<br/>
arborescent (où chaque action peut produire une<br/>
branche), il faut utiliser un <strong>arbre</strong>, pas<br/>
seulement deux piles. C'est le modèle utilisé par<br/>
certains éditeurs avancés (vim, Emacs en mode<br/>
undo-tree).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Deux piles, une « historique » et une « refaire »</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est le schéma standard des<br/>
éditeurs de texte. Les deux piles évoluent<br/>
symétriquement, sauf au moment d'une nouvelle<br/>
action, qui rend impossible de « refaire » les<br/>
actions annulées précédemment (c'est le<br/>
comportement attendu : on ne peut pas refaire<br/>
ce qui n'existe plus dans la branche<br/>
d'historique courante).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un dictionnaire indexé par l'instant de l'action</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Solution surdimensionnée : un dictionnaire<br/>
permet d'aller à n'importe quel instant, ce<br/>
qui n'est pas demandé pour Ctrl+Z/Ctrl+Y. Les<br/>
deux opérations agissent toujours sur la<br/>
dernière action ou la dernière action<br/>
annulée, ce qui correspond à des piles.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une seule pile suffit</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : avec une seule pile, on peut annuler<br/>
mais on perd définitivement les actions<br/>
annulées. Pour pouvoir les <strong>refaire</strong>, il<br/>
faut les conserver quelque part : c'est le<br/>
rôle de la deuxième pile.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une file pour l'historique, une pile pour le refaire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une file annulerait l'action la plus<br/>
ancienne (FIFO), alors qu'on veut annuler la<br/>
plus récente (LIFO). Il faut donc une <strong>pile</strong><br/>
pour l'historique, pas une file.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q29 : Deux implémentations d'une même file</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Deux programmeurs implémentent une file : l'un avec<br/>
une liste Python, l'autre avec deux piles. Qu'ont en<br/>
commun leurs deux versions ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L'interface d'une structure est la liste de ses<br/>
opérations et de ce qu'elles garantissent ;<br/>
l'implémentation est la façon de les programmer.<br/>
Plusieurs implémentations peuvent respecter la même<br/>
interface, avec des coûts différents.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Rien du tout : une file construite avec deux piles n'est pas une vraie file, seule la liste en est une</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Si elle rend les éléments dans l'ordre d'arrivée,<br/>
c'est une file, quelle que soit sa construction.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le même coût pour chaque opération, puisque les deux versions produisent exactement le même résultat</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le coût dépend de l'implémentation : pop(0) sur<br/>
une liste décale tous les éléments, les deux<br/>
piles l'évitent.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le même code, à quelques noms de variables et de fonctions près, puisque le résultat est le même</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les codes diffèrent entièrement ; seul le<br/>
comportement observable est identique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La même interface (enfiler, defiler, est_vide) et le même ordre premier entré, premier sorti</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un programme qui utilise la file ne voit aucune<br/>
différence entre les deux.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q30 : Remplacer l'implémentation sans toucher au programme</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Un programme de gestion d'impressions utilise une<br/>
file uniquement par enfiler, defiler et<br/>
est_vide. On remplace l'implémentation de la file<br/>
par une version plus rapide qui offre les mêmes<br/>
opérations. Que faut-il modifier dans le programme ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le programme ne connaît la file que par ses trois<br/>
opérations. Tant que la nouvelle implémentation les<br/>
fournit avec le même comportement, aucun appel ne<br/>
change. C'est la distinction entre interface et<br/>
implémentation.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Tous les appels à defiler, car la nouvelle version rend les éléments dans l'autre sens</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Une file reste une file : defiler rend toujours<br/>
le plus ancien élément, sinon l'interface ne<br/>
serait pas respectée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le programme entier, une structure de données ne se remplaçant pas en cours de projet</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Séparer interface et implémentation sert<br/>
précisément à rendre ce remplacement indolore.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les noms des opérations, qui dépendent de l'implémentation choisie</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les noms font partie de l'interface, justement<br/>
conservée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Rien : il n'utilise que l'interface, qui n'a pas changé</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>C'est tout l'intérêt de programmer contre une<br/>
interface : l'implémentation peut changer<br/>
librement.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q31 : Deux codes, une même file ?</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Deux implémentations d'une file à partir d'une liste<br/>
Python f, initialement vide :</p>
<p>- version A : enfiler(x) fait f.append(x) et<br/>
  defiler() renvoie f.pop(0) ;<br/>
- version B : enfiler(x) fait f.insert(0, x) et<br/>
  defiler() renvoie f.pop().</p>
<p>On enfile 1, 2 puis 3, et on défile trois<br/>
fois. Laquelle se comporte comme une file ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Les deux versions respectent le comportement premier<br/>
entré, premier sorti : elles implémentent la même<br/>
interface. Elles diffèrent par le coût : chacune<br/>
contient une opération qui décale tous les éléments<br/>
(pop(0) dans A, insert(0, x) dans B).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Seule la version A, la version B rendant 3, 2, 1</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Dans B, après trois enfilements la liste vaut<br/>
[3, 2, 1] et pop() retire 1, le plus<br/>
ancien.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Les deux : chacune rend 1, puis 2, puis 3</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>A range à droite et retire à gauche ; B range à<br/>
gauche et retire à droite. Dans les deux cas, le<br/>
plus ancien sort en premier.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucune des deux, une file ne pouvant pas se construire avec une seule liste</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Une liste suffit ; les deux versions respectent<br/>
l'interface, avec des coûts différents.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Seule la version B, la version A rendant 3, 2, 1</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Dans A, la liste vaut [1, 2, 3] et pop(0)<br/>
retire 1 : l'ordre d'arrivée est respecté.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q32 : Une pile qui empile en tête</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>``python<br/>
class Pile:<br/>
    def __init__(self):<br/>
        self.elements = []</p>
<p>def empiler(self, x):<br/>
        self.elements.insert(0, x)</p>
<p>def depiler(self):<br/>
        return self.elements.pop(0)</p>
<p>def est_vide(self):<br/>
        return len(self.elements) == 0<br/>
``</p>
<p>Cette classe est-elle une implémentation correcte<br/>
d'une pile ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La classe respecte l'interface d'une pile : dernier<br/>
entré, premier sorti. Elle est simplement moins<br/>
efficace que la version qui empile en fin de liste,<br/>
car insert(0, x) et pop(0) décalent tous les<br/>
éléments à chaque opération.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Oui : le dernier empilé est le premier dépilé ; seul le coût diffère de la version append et pop()</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Après empiler(1), empiler(2), empiler(3), la<br/>
liste vaut [3, 2, 1] et depiler() renvoie<br/>
3.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Non : depiler renvoie le premier élément empilé, ce qui en fait une file et non une pile</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>pop(0) retire l'élément en tête, et c'est le<br/>
dernier empilé qui s'y trouve.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Oui, mais seulement pour des entiers, la méthode insert refusant les autres types de valeurs</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>insert accepte n'importe quel objet ; le type<br/>
des éléments n'a aucune importance.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Non : une pile doit obligatoirement s'écrire avec append pour empiler et pop() pour dépiler</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'interface impose un comportement, pas des<br/>
méthodes de liste précises.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q33 : Trace d'une suite d'opérations sur une file</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Sur une file vide, on enfile 3, on enfile 7, on défile, on<br/>
enfile 2, on défile, puis on enfile 9. Que contient la<br/>
file, de la tête vers la queue ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Dans une file, défiler retire toujours l'élément le plus ancien ;<br/>
suivre une trace, c'est tenir la liste des arrivées non encore<br/>
servies.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>2 puis 9</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : le premier défilement retire 3, le second<br/>
retire 7 ; restent 2 puis 9, dans l'ordre d'arrivée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>3 puis 9, comme dans une pile</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait le contenu d'une pile, où l'on retire le<br/>
dernier arrivé.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>7 puis 2</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 7 a été retiré par le second défilement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>9 puis 2</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 2 est arrivé avant 9, il est donc en tête.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q34 : Une file construite avec deux piles</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Une file est réalisée avec deux piles, entree et sortie :<br/>
enfiler empile sur entree. Pour défiler, que faire quand<br/>
sortie est vide ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Deux inversions successives rétablissent l'ordre d'arrivée : c'est<br/>
ce qui permet de faire une file avec deux piles.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Échanger les noms des deux piles sans déplacer aucun élément</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : échanger ne renverse pas l'ordre, le sommet resterait<br/>
le dernier arrivé.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Renvoyer une erreur, la file étant forcément vide elle aussi</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la file peut contenir des éléments encore dans<br/>
entree.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Vider entree dans sortie un par un, puis dépiler sortie</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : en passant d'une pile à l'autre, l'ordre<br/>
s'inverse, le plus ancien se retrouve au sommet de sortie.<br/>
Chaque élément n'est déplacé qu'une fois, le coût moyen reste<br/>
constant.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Dépiler directement entree, qui contient tous les éléments</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le sommet de entree est le dernier arrivé, on<br/>
obtiendrait une pile.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q35 : Le premier élément servi</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Une file contient, de la tête vers la queue, 4, 8 et<br/>
1. On enfile 6 puis on défile. Quelle valeur est<br/>
retirée ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Premier arrivé, premier servi : enfiler et défiler agissent aux<br/>
deux extrémités opposées.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>6, le dernier enfilé</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : retirer le dernier arrivé serait le comportement d'une<br/>
pile.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>1, le dernier avant l'ajout</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 1 est en queue, loin de la tête.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>8, l'élément du milieu</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 8 ne sort qu'après 4.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>4, la tête de la file</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : enfiler ajoute en queue et ne change pas la<br/>
tête ; défiler retire la tête, 4.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q36 : Une file dans un tableau de taille fixe</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Une file est rangée dans un tableau de taille fixe avec deux<br/>
indices, tete et queue, qui avancent à chaque défilement et à<br/>
chaque enfilement. Que faire quand queue atteint la fin du<br/>
tableau alors que des cases du début ont été libérées ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le tableau circulaire donne des enfilements et défilements en temps<br/>
constant avec une mémoire fixe.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Refuser l'enfilement, la file devant être considérée comme pleine</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : des cases sont libres, la file n'est pas pleine.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Reprendre à l'indice 0, le tableau étant parcouru en cercle</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : les indices avancent modulo la taille du<br/>
tableau. Les cases libérées en tête sont réutilisées, sans<br/>
jamais décaler les éléments.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Décaler tous les éléments vers le début du tableau à chaque fois</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : décaler coûte un temps proportionnel au nombre<br/>
d'éléments, ce que l'on cherche à éviter.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Remettre tete à 0 sans toucher à queue, qui reste en place</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : tete désigne le plus ancien élément, le déplacer<br/>
perdrait des valeurs.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q37 : Transvaser une liste par une pile</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que contient sortie à la fin ?<br/>
`<code>python<br/>
pile = []<br/>
for x in [1, 2, 3]:<br/>
    pile.append(x)<br/>
sortie = []<br/>
while pile:<br/>
    sortie.append(pile.pop())<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Empiler puis dépiler tout renverse une séquence : c'est le<br/>
comportement dernier entré, premier sorti.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>[1, 2, 3]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : passer par une pile inverse l'ordre.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>[3, 2, 1]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : les éléments sortent de la pile dans l'ordre<br/>
inverse de leur entrée ; sortie est la liste renversée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une erreur, pop sur une pile vide</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la boucle while pile s'arrête dès que la pile est<br/>
vide, avant tout pop fautif.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>[]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : sortie reçoit chaque élément dépilé.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q38 : La hauteur maximale d'une pile de parenthèses</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On lit ((())()) caractère par caractère, en empilant chaque<br/>
parenthèse ouvrante et en dépilant à chaque fermante. Quelle<br/>
hauteur maximale la pile atteint-elle ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La hauteur de la pile mesure l'imbrication courante ; son maximum<br/>
est la profondeur de l'expression.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>8, la longueur de la chaîne</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : seules les ouvrantes sont empilées, et pas toutes en<br/>
même temps.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>0, la pile finissant vide</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la pile finit vide, mais elle a été remplie entre<br/>
temps.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>3, au plus profond de l'imbrication</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la hauteur de la pile est le nombre de<br/>
parenthèses ouvertes non encore fermées ; son maximum est la<br/>
profondeur d'imbrication, 3 ici.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>4, le nombre de parenthèses ouvrantes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les fermantes dépilent en cours de route, la pile ne<br/>
contient jamais toutes les ouvrantes à la fois.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q39 : Une file pour visiter niveau par niveau</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour visiter un arbre ou un graphe niveau par niveau, on range les<br/>
sommets découverts dans une file. Pourquoi une file et non une<br/>
pile ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>File ou pile, le même algorithme de parcours change d'ordre de<br/>
visite : largeur avec une file, profondeur avec une pile.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une file est plus rapide qu'une pile pour ajouter des sommets</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les deux structures ont des opérations en temps<br/>
constant.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une pile ne peut pas contenir des sommets, seulement des nombres</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une pile le peut, mais elle rendrait les derniers<br/>
découverts en premier, ce qui donne le parcours en profondeur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Les sommets sont traités dans l'ordre de leur découverte</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la file rend les sommets dans l'ordre où ils y<br/>
sont entrés ; un niveau entier est traité avant le suivant.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une file évite de visiter deux fois le même sommet</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est le marquage des sommets visités qui l'évite,<br/>
avec l'une ou l'autre structure.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q40 : Une file en liste chaînée à coût constant</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment réaliser une file avec une liste chaînée pour que<br/>
enfiler et défiler soient tous deux en temps constant ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Les deux extrémités d'une liste chaînée doivent être accessibles<br/>
directement pour obtenir une file en temps constant.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Ajouter en tête et retirer en tête, sans lien vers la fin</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait une pile, le dernier arrivé sortant le<br/>
premier.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Ajouter en queue et retirer en queue, avec un lien vers la fin</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ajouter et retirer du même côté donne une pile.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Ajouter en tête et retirer en queue, en parcourant la liste</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : atteindre le dernier maillon demande de parcourir<br/>
toute la liste, le défilement coûte alors un temps linéaire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Garder un lien vers la fin, ajouter en queue, retirer en tête</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : garder un lien vers la tête et un vers le<br/>
dernier maillon permet d'ajouter à la fin et de retirer au<br/>
début sans parcourir la liste.</p>]]></text>
    </feedback>
  </answer>
</question>

</quiz>
