<?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>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="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="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="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>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="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="0" format="html">
    <text><![CDATA[<p>get et set</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce sont des opérations d'accès indexé,<br/>
plutôt sur un tableau ou un dictionnaire.</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>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>push (empiler) et pop (dépiler)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : push(x) ajoute x au sommet ;<br/>
pop() retire et renvoie l'élément du sommet. On<br/>
a aussi souvent peek() ou top() (consulter<br/>
sans retirer) et is_empty() (tester la vacuité).</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>
</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 : push /<br/>
shift en JavaScript, append / popleft avec<br/>
collections.deque en Python, etc. Le concept reste<br/>
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>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 (enfiler) et dequeue (défiler)</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>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>sort et reverse</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : opérations sur les listes, pas sur les<br/>
files.</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="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>
  <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>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 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>
</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>Variantes possibles : files de <strong>priorité</strong> (où<br/>
l'ordre dépend d'une priorité, pas seulement<br/>
d'arrivée), implémentées par des tas (heaps) plutôt<br/>
que des files simples.</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>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="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="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() pour empiler et pop() pour dépiler</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>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>
  <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>Une chaîne de caractères</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>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q08 : File en Python efficace</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour implémenter une file efficace en Python, quelle<br/>
structure de la bibliothèque standard utilise-t-on ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Bonne pratique : from collections import deque ;<br/>
f = deque() ; f.append(x) ; f.popleft(). C'est aussi<br/>
ce qu'utilisent les algorithmes parcours en largeur sur des graphes.</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>collections.deque (file double-ended) avec append() et popleft(), toutes deux en O(1)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : deque est la structure adaptée.<br/>
Elle permet l'ajout et la suppression aux deux<br/>
bouts en temps constant.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>tuple</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un tuple est immuable. On ne peut pas y<br/>
ajouter d'éléments.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>list, en utilisant append() et pop(0)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pop(0) est en O(n) car il faut<br/>
décaler tous les éléments. C'est inefficace pour<br/>
de grandes files.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>set (ensemble)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un ensemble n'a pas d'ordre. Inadapté à<br/>
une file.</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="0" format="html">
    <text><![CDATA[<p>Stocker les données 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>
  <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="100" format="html">
    <text><![CDATA[<p>Empiler le contexte de chaque appel de fonction (paramètres, variables locales, adresse de retour) et le dépiler à la fin de la 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>
</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 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="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="100" format="html">
    <text><![CDATA[<p>Une liste où chaque élément contient sa valeur et une référence vers l'élément 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 : 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>
  <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>
</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) (linéaire)</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.</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 est utilisée dans les calculatrices<br/>
RPN (HP, par exemple) et dans certaines machines<br/>
virtuelles (la JVM). Elle évite la gestion explicite<br/>
des parenthèses.</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 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>
  <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>Un arbre binaire</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="100" format="html">
    <text><![CDATA[<p>Une pile : on empile les nombres et, à chaque opérateur, on dépile les deux derniers, on calcule, et on rempile le résultat</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : 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>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q14 : Parcours en largeur et parcours en profondeur</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour un parcours en <strong>largeur</strong> d'un graphe ou<br/>
d'un arbre, quelle structure utilise-t-on ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Mémo : <strong>pile = profondeur</strong> ; <strong>file = largeur</strong>.<br/>
C'est l'application algorithmique la plus<br/>
classique de ces deux structures.</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 file</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on enfile les voisins à explorer<br/>
; en défilant à chaque étape, on visite d'abord<br/>
tous les voisins du niveau actuel avant de passer<br/>
au suivant. C'est exactement le parcours en<br/>
largeur.</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 structure d'ordre dans un<br/>
dictionnaire (sauf en Python 3.7+, mais ce<br/>
n'est pas l'intention ici).</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 : aucun tri n'est requis pour parcours en largeur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une pile</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la pile correspond au parcours en<br/>
<strong>profondeur</strong>. Pour la largeur, c'est<br/>
différent.</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<br/>
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="100" format="html">
    <text><![CDATA[<p>Elles définissent un comportement (LIFO ou FIFO) sans imposer la structure interne (tableau, liste chaînée, etc.)</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 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="0" format="html">
    <text><![CDATA[<p>Elles ne peuvent pas ê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 : encapsuler la pile dans une classe<br/>
qui lève une exception explicite (PileVideError)<br/>
plutôt que d'exposer l'erreur Python brute. Cela<br/>
rend le code utilisateur plus clair.</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>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 (par exemple avec is_empty())</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>
  <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>
</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="100" format="html">
    <text><![CDATA[<p>L'insertion et la suppression en tête se font en temps constant, sans avoir à décaler d'autres éléments</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 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="0" format="html">
    <text><![CDATA[<p>Elle est intrinsèquement 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>Encapsulation : la liste sous-jacente est privée<br/>
(self._tab ou self.__tab). L'utilisateur ne<br/>
manipule que les méthodes de la pile, pas la liste.<br/>
C'est ce qui distingue une pile abstraite d'un<br/>
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="0" format="html">
    <text><![CDATA[<p>get, set indexés</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait un tableau, pas une pile.</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()</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : trop minimaliste. Une pile expose<br/>
plusieurs opérations distinctes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>empiler(x), depiler(), sommet() (ou peek), est_vide()</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : ces quatre méthodes constituent<br/>
l'API minimale d'une pile. Souvent, on ajoute<br/>
taille() ou __len__() pour des raisons<br/>
pratiques.</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>Toutes deux sont 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="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="100" format="html">
    <text><![CDATA[<p>(()) est correcte ; (() est incorrecte (la première parenthèse n'est jamais fermée)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : avec une pile, on empile chaque<br/>
(, on dépile à chaque ). À la fin de la<br/>
deuxième chaîne, la pile contient encore une<br/>
parenthèse non fermée, donc déséquilibrée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Toutes deux sont incorrectes</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>
</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><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="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>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>
  <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="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>
</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. deque (de<br/>
<em>double-ended queue</em>) est l'outil adapté pour des<br/>
files efficaces, avec append à droite et<br/>
popleft à gauche, tous deux en O(1).</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 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>Parce qu'il faut décaler tous les autres éléments d'un cran vers la gauche, ce qui est en O(n)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : les listes Python sont des<br/>
tableaux dynamiques contigus en mémoire. Retirer<br/>
le premier élément force à recopier tous les<br/>
autres. Pour une file efficace, utiliser<br/>
collections.deque (deux pointeurs internes,<br/>
O(1) aux deux bouts).</p>]]></text>
    </feedback>
  </answer>
  <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>
</question>

<question type="multichoice">
  <name>
    <text>Listes, piles, files — Q22 : Tampon circulaire</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Un <strong>tampon circulaire</strong> (<em>ring buffer</em>) est :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le tampon circulaire est très efficace : pas<br/>
d'allocation dynamique, mémoire prévisible. Mais sa<br/>
taille étant fixe, il faut gérer le cas où il est<br/>
plein (écraser les anciens, ou refuser le nouveau).</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>Un dictionnaire trié</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un dictionnaire associe<br/>
des clés à des valeurs et<br/>
n'a pas de notion de<br/>
tampon ni de circularité.<br/>
Le tampon circulaire est<br/>
quant à lui une file de<br/>
taille fixe utilisée pour<br/>
des flux continus.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une liste chaînée fermée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est plutôt une liste circulaire, pas un<br/>
tampon circulaire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Une file implémentée sur un tableau de taille fixe, où l'on revient au début quand on dépasse la fin</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : très utilisé pour des buffers<br/>
temps-réel (audio, vidéo, journaux d'événements).<br/>
Comme la taille est fixe, on évite les<br/>
allocations dynamiques, et la « circularité »<br/>
permet d'utiliser tout l'espace disponible.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une pile de taille variable</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un tampon circulaire<br/>
n'est pas une pile : il<br/>
implémente une file (au<br/>
sens FIFO) sur un<br/>
tableau de taille fixe,<br/>
comme expliqué dans la<br/>
bonne réponse.</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="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="100" format="html">
    <text><![CDATA[<p>Une pile, qui simule la pile d'appels gérée implicitement par le langage</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 arbre</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 : File de priorité</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Une <strong>file de priorité</strong> (priority queue) diffère d'une<br/>
file FIFO classique en ce que :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Files de priorité utilisées dans : Dijkstra (plus<br/>
courts chemins), algorithme A*, ordonnancement par<br/>
priorité, simulation d'événements discrets. En<br/>
Python : module heapq.</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>Elle ne stocke que les nombres</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on peut y stocker n'importe quel type<br/>
d'élément, à condition d'avoir un critère de<br/>
priorité.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucune différence</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la différence est essentielle.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Elle est plus rapide que la file ordinaire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : elle est généralement plus lente<br/>
(O(\log n) vs O(1)). L'avantage est<br/>
fonctionnel, pas la rapidité.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>L'élément retiré est celui qui a la priorité la plus élevée, pas forcément le plus ancien</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : par exemple, dans un hôpital, on<br/>
traite d'abord les cas les plus urgents, pas<br/>
ceux arrivés en premier. Implémentation typique :<br/>
un <strong>tas binaire</strong> (heap), avec opérations en<br/>
O(\log n).</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 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="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>
  <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>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>
</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><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>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>`<code><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><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><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<br/>
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>
</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="100" format="html">
    <text><![CDATA[<p>On utilise une pile : on empile le sommet de<br/>
départ, puis on répète : dépiler un sommet, le<br/>
marquer comme visité, et empiler ses voisins<br/>
non visités. La pile reproduit l'ordre LIFO de<br/>
la récursion</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>
  <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="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 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>
</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="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 file pour l'historique, une pile pour le<br/>
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>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Deux piles : une pile « historique » qui contient<br/>
les actions déjà effectuées, et une pile<br/>
« refaire » qui contient les actions annulées.<br/>
Annuler = dépiler de l'historique, empiler dans<br/>
refaire ; refaire = dépiler de refaire,<br/>
empiler dans l'historique. Toute nouvelle<br/>
action vide la pile « 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>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>
</question>

</quiz>
