Vous êtes sur la page 1sur 2

STPI 2A (2017-2018)

Algorithmique et programmation 3
Examen

Exercice 1
Nous avons étudié en cours une mise en oeuvre des piles à l’aide de tableaux. Nous proposons dans
cet exercice deux mises en oeuvres différentes : la première est basée sur une liste chaînée (question 1)
et la seconde sur un tableau avec réallocation (question 2). La question 3 aborde l’application des piles à
l’évaluation d’expressions arithmétiques.
Les réponses à cet exercice devront être écrites en pseudo-code en respectant les conventions présentées
en cours.
Rappel : en pseudo-code, une variable définie dans le corps d’une fonction est détruite à la sortie de
cette fonction. Cela va poser problème pour certaines fonctions de cette exercice. Pour indiquer qu’une
variable définie dans le corps d’une fonction n’est pas détruite à la sortie de cette fonction, on préfixera sa
déclaration par le mot-clé new.
1. Mise en oeuvre des piles à l’aide de listes chaînées
On considère les déclarations suivantes :
Structure NoeudhXi
Variable item : X
Variable suivant : Pointeur sur NoeudhXi
FinStruct
Structure ListeChaînéehXi
Variable tête : Pointeur sur NoeudhXi
FinStruct
Le type ListeChaînéehXi représente une liste chaînée d’éléments d’un type générique X.
(a) Déclarer une structure PileLChXi qui représente une pile mise en oeuvre à l’aide d’une liste chaî-
née. Le dernier élément inséré dans la pile correspondra à l’item du noeud pointé par la tête de la
liste chaînée.
(b) Écrire la fonction empiler en Θ(1). Cette fonction aura deux paramètres : la pile où l’on empile et
la valeur, de type X, que l’on souhaite empiler.
(c) Écrire la fonction dépiler en Θ(1). Cette fonction aura un unique paramètre : la pile d’où l’on
souhaite dépiler.
(d) Quel est l’intérêt de cette mise en oeuvre par rapport à celle étudiée en cours ?
2. Mise en oeuvre à l’aide d’un tableau avec réallocation
On considère à présent une approche alternative pour mettre en oeuvre une pile. L’objectif est ici encore
de gérer des piles avec un nombre d’éléments a priori quelconque (non borné). Pour cela on utilise un
tableau. Voici les déclarations avec lesquelles nous allons travailler :
Structure PileTab2hXi
Variable tab : Tableau de X
Variable n : Entier
// n est le nombre d’éléments présents dans la pile. À ne surtout pas confondre avec la taille
du tableau
FinStruct

(a) Écrire une fonction d’initialisation init. Après un appel à cette fonction, la pile devra être dans un
état qui correspond à une pile vide.
(b) Écrire la fonction empiler. Cette fonction aura deux paramètres : la pile où l’on empile et la valeur,
de type X, que l’on souhaite empiler. Voici la stratégie à suivre :

AP3 - Examen M. Hidane, P. Berthomé, C. Eichler, J. Mille, J. Olivier 2017-2018


— Si la taille est trop petite, il faut créer un nouveau tableau dont la taille est le double de la taille
actuelle.
— Sinon, on insère simplement comme vu en cours.
(c) Écrire la fonction dépiler. Cette fonction aura un paramètre : la pile d’où l’on souhaite dépiler un
élément. L’enjeu ici est de ne pas garder une taille de tableau trop grande si on n’en a pas besoin.
Au vue de la règle proposée dans la question précédente, il ne faut pas se retrouver avec une pile
qui utilise un tableau dont la taille est supérieure ou égale à 4 fois le nombre d’éléments présents
dans la pile. Si c’est la cas, il réallouer un tableau 2 fois plus petit.
(d) Quelle l’intérêt de la stratégie proposée dans cette partie par rapport à celle vue en cours ?
3. Évaluation d’une expression arithmétique à l’aide de piles
L’objectif ici est d’évaluer, c’est-à-dire calculer, le résultat d’une expression arithmétique telle que

(1 + ((2 + 3) ∗ (4 ∗ 5))).

On ne considère ici que des expressions arithmétiques faisant apparaître les opérations +, -, * et /. De
plus, les expressions considérées sont complètement parenthésées (on met une parenthèse au début,
une à la fin, et autour de toute sous-expression). Une telle expression sera représentée par une chaîne de
caractères. On suppose de plus qu’on dispose d’une fonction car2nombre qui permet de transformer un
caractère représentant un nombre en ce nombre. De même, on suppose que l’on dispose de la fonction
nombre2car qui transforme un nombre en un caractère le représentant.
En 1960, Edsgar Dijkstra a proposé un algorithme qui permet d’évaluer une expression arithmétique
complètement parenthésée. Voici le principe : on maintient deux piles (une pour les opérateurs et une
pour les opérandes). On procède de gauche à droite de l’expression :
— On empile les opérandes dans la pile des opérandes
— On empile les opérateurs dans la pile des opérateurs
— On ignore les parenthèses ouvrantes
— Quand on rencontre une parenthèse fermante, on dépile un opérateur, on dépile ses opérandes, on
empile dans la pile des opérandes le résultat de l’application de cet opérateur à ses opérandes.
(a) Où se trouve le résultat de l’expression quand on a traité la dernière parenthèse fermante ?
(b) On suppose que les calculs ne font intervenir que des nombres entiers. Programmer la fonction
Fonction calcul(IN Variable expr : Chaîne de caractères) : Entier

FinPour
qui retourne le résultat d’une expression arithmétique passée en paramètre. Vous pouvez utiliser
une des deux mises en ouvre précédentes des piles.

AP3 - Examen 2 /2 2017-2018

Vous aimerez peut-être aussi