8INF259 STRUCTURE DE DONNEES LISTE, PILES, FILES LANDRY D. CHAPWOUO T., UQAC/DIM mardi 4 octobre 2016LANDRY CHAPWOUO.

Slides:



Advertisements
Présentations similaires
Piles Premier arrivé, dernier servi: LIFO (Last In, First Out) Liste à usage restreint: Enlève et insère un élément seulement à un bout de la liste. Notation:
Advertisements

Structures de données IFT-10541
LES PILES ET FILES.
Liste Une liste est une séquence d’éléments. Concept important: Chaque élément possède une position dans la liste. Notation: De quelles opérations a-t-on.
C++ Les fonctions. Présentation Utilité : Dès qu'un programme dépasse la centaine de lignes de code, il est pratique de pouvoir le décomposer en plusieurs.
CINI – Li115 1 Semaine 9 Algorithmes de tri ● Introduction ● Tri à bulle ● - principe ● - algorithme ● - efficacité ● Tri par sélection ● - principe, algorithme,
Tableaux et Pointeurs Chaînes de Caractères Programmation Impérative II.
1 Programmation en C++ C++ de base ● Programme C++ ● Variables, objets, types ● Fonctions ● Namespace ● Tests ● Boucles ● Pointeurs, références.
CINI – Li115 1 Semaine 11 Les pointeurs (suite) ● Tableaux et pointeurs ● Questions sur les pointeurs.
Comment utiliser le débogueur de Visual Studio /8/2015 INF145 1 Créé par Julien Galarneau Allaire, révisé par Eric Thé S.E.G.
1 Programmation en C++ Cycle de vie ● La vie d'un objet ● Destructeur ● Gestion de mémoire dynamique.
Volée 1316 S3 Cours No 2_3 : Le nombre en 1-2H. Les fonctions du nombre  Dénombrer, énumérer, décrire une collection. Aspect cardinal  Dater, classer,
1 Programmation en C++ IO en C++/SL ● Standard Library ● Types, objets pour IO ● L'entrée de clavier ● Sortie à l'écran ● Fichiers.
1 Bonnes Pratiques ● Indentation ● Présentation ● Initialisation des variables ● Conditions ● Gestion d'erreurs ● Conventions.
Cours COMPOSANTES DES VECTEURS Dimitri Zuchowski et Marc-Élie Lapointe.
MàN Info Licence acoustique
annuités, mensualités remboursements constants VPM pendant une période ininterrompue
UE2 - M22 Licence acoustique
Semaine 8 Retour sur les tableaux : fonctions et récursivité
Programmation en C++ Standard Library
Un Algorithme , c'est Quoi ?
LES TABLEAUX EN JAVA.
Session 1 6 mars 2017 Plateforme ICONICS Justine Guégan
Eléments d’Informatique Cours11 – Allocation dynamique, listes chaînées Catherine Recanati.
Détection des erreurs.
Algorithme et programmation
Les Tableaux Mme DJEBOURI. D.
1.3 COORDONNÉES DES POINTS
Lois fondamentales de l'algèbre de Boole
Ajouter le code dans une page html
Ce videoclip produit par l’Ecole Polytechnique Fédérale de Lausanne
L’Instruction de Test Alternatif
Gestion dynamique de la mémoire : new / delete
SIF-1053 Architecture de ordinateurs
Bases de programmation en Python
Principes de programmation (suite)
Tableaux à plusieurs dimensions en langage C
Fonctions logiques et algèbre booléenne
Algorithmique & Langage C
Présentation Structure données abstraite (TDA) Rappel : File
Plan Introduction Parcours de Graphe Optimisation et Graphes
VI. Tri par tas (Heap sort)
Programmation Impérative II
Semaine #4 INF130 par Frédérick Henri.
Implantation d’un îlot ou d’une Chaîne de Production
« Un langage de programmation est une convention pour donner des ordres à un ordinateur. Ce n’est pas censé être obscur, bizarre et plein de pièges subtils.
Information, Communication, Calcul
Algorithmique & Langage C IUT GEII S1 Notes de cours (deuxième partie)
Création Et Modification De La Structure De La Base De Données
Programmation en C++ C++ de base
PROGRAMMATION ET ENSEIGNEMENT
Chapter 12: Structures de données
NUMERATION et REPRESENTATION DES NOMBRES
B.Shishedjiev - Informatique
Lois de Probabilité Discrètes
Semaine #2 INF130 par Frédérick Henri.
Objets Opérateurs Listes
Les structures de base Listes chainées. Listes Les listes(similaire aux tableaux) sont des structures informatiques qui permettent de garder en mémoire.
Filière Génie Civil – 2018 Langage C Tableaux – Exercices de révision
Le code de Huffman: est une méthode de compression statistique de données qui permet de réduire la longueur du codage d'un alphabet. Le code de Huffman.
H. Wertz -- Exécution Symbolique
Opérateurs et fonctions arithmétiques Opérateurs de relation Opérateurs logiques Cours 02.
Tris Simples/Rapides.
Exercices récapitulatifs
PROGRAMMATION ET ENSEIGNEMENT
QCM Pointeurs 2 / Q1 On considère la déclaration suivante : char *ptc ; ptc peut contenir : 1) des valeurs de variables de type caractère 2) des adresses.
LISTES.
Arbre binaire.
Python Nicolas THIBAULT
Type Tableau Partie 1 : Vecteurs
Transcription de la présentation:

8INF259 STRUCTURE DE DONNEES LISTE, PILES, FILES LANDRY D. CHAPWOUO T., UQAC/DIM mardi 4 octobre 2016LANDRY CHAPWOUO - 8INF259 1

LES PILES mardi 4 octobre 2016LANDRY CHAPWOUO - 8INF259 2

Définition et exemple o La pile est une structure très utilisée en informatique, (appel de procédures, calcul des expressions arithmétiques,…). o La pile est une liste ordonnée sans fin d’éléments dans laquelle on ne peut introduire ou enlever un élément qu'à une extrémité appelée tête de pile ou sommet de pile. o Exemple: une pile de livres, une pile d’assiettes. o Noter que dans une pile, le dernier élément inséré sera le premier à être supprimé, retiré : on parle de liste LIFO ‘Last In First Out’. mardi 4 octobre 2016LANDRY CHAPWOUO - 8INF259 3

Opérations sur les piles o Les opérations de base sur les piles sont très simples. o Empiler (p,e) (en anglais push) : empile l’élément e dans la pile p. o Dépiler (p) (en anglais pop): dépile un élément de la pile et retourne la valeur de cet élément (e = Depiler (p)) o Toutes les opérations sont effectuées sur la même extrémité; on parle de structure en FIFO. mardi 4 octobre 2016LANDRY CHAPWOUO - 8INF259 4

Opérations sur les piles o Il n’y a aucune limite au nombre d’éléments qu’on peut empiler. Par contre, on ne peut dépiler d’une pile vide. A cet effet, on a une fonction PileVide(p) qui retourne Vrai si la pile est vide sinon Faux. o InitialiserPile(p) ou ViderPile(p) : vide la pile p mardi 4 octobre 2016LANDRY CHAPWOUO - 8INF259 5

Opérations sur les piles o On peut vouloir aussi connaître le sommet de pile sans le supprimer (dépiler). o e= SommetDePile(p) : Ce n’est pas réellement une nouvelle opération car on peut l’exprimer comme suit : o e = Dépiler (p) o Empiler (e,p) o SommetDePile() et Dépiler() ne fonctionnent pas sur une pile vide. Aussi, on ne peut empiler dans une pile pleine. mardi 4 octobre 2016LANDRY CHAPWOUO - 8INF259 6

Implantation par tableau o Il faut être bien conscient qu’un tableau est différent d’une pile. o Un tableau a une taille fixe alors que la pile est une structure dynamique: o sa taille change à chaque fois que de nouveaux éléments sont empilés ou dépilés. o Cependant, on peut utiliser un tableau pour accueillir une pile en respectant les conditions suivantes : o Dimensionner le tableau au nombre d’éléments que peut contenir la pile. o Restreindre les éléments de la pile à un type identique. o Utiliser une variable spéciale, sommet, contenant à tout instant l’indice de la case du tableau où se trouve l’élément du sommet de pile. mardi 4 octobre 2016LANDRY CHAPWOUO - 8INF259 7

Implantation par tableau (Exemple 1) o Une pile en C++ est une classe définie comme suit: // Fichier Pile.h // declaration de la classe pile #ifndef PILE_H #define PILE_H La pile générique (template) : #include const Taille_de_Pile = 10; mardi 4 octobre 2016LANDRY CHAPWOUO - 8INF259 8

Implantation par tableau template class Pile { private : int Taille; // Taille Maximum de la pile int Sommet; // indice de la première position libre dans le tableau T * TabElement; // Tableau contenant les éléments de la pile mardi 4 octobre 2016LANDRY CHAPWOUO - 8INF259 9

Implantation par tableau public : Pile (const int dim = Taille_de_Pile ) ; // Constructeur ~Pile () ; // destructeur : libère l'espace alloué à la pile void ViderPile (); // enlève tous les éléments de la pile void Empiler ( const T & );// ajoute un élément au dessus de la pile T Depiler (); // retire un élément du sommet de la pile T Sommet_De_Pile () const; // Renvoie la valeur du sommet de la pile bool PileVide () const; // Renvoie vrai (true) si la pile est vide }; mardi 4 octobre 2016LANDRY CHAPWOUO - 8INF259 10

Implantation par tableau template Pile ::Pile ( const int dim ) // Constructeur { Taille = dim; Sommet = 0; TabElement = new T[dim]; } template Pile ::~Pile () // destructeur : libère l'espace alloué à la pile { delete TabElement; } mardi 4 octobre 2016LANDRY CHAPWOUO - 8INF259 11

Implantation par tableau template void Pile ::ViderPile () { Sommet = 0; } template void Pile ::Empiler ( const T & elem ) { assert ( Sommet < Taille ); TabElement[Sommet++] = elem; } mardi 4 octobre 2016LANDRY CHAPWOUO - 8INF259 12

Implantation par tableau template T Pile ::Depiler () { assert( !PileVide() ); return TabElement[--Sommet]; } mardi 4 octobre 2016LANDRY CHAPWOUO - 8INF259 13

Implantation par tableau template T Pile ::Sommet_De_Pile () const { assert ( !PileVide() ); return TabElement[Sommet-1]; } template bool Pile ::PileVide () const { return Sommet == 0; } mardi 4 octobre 2016LANDRY CHAPWOUO - 8INF259 14

Implantation par tableau o La déclaration Pile p1(6) ; crée une instance de pile d’entiers de 6 éléments. o La déclaration Pile p1(6) ; crée une instance de pile de caractères de 6 éléments. o Noter l’utilisation de assert ( !PileVide ); Cette instruction permet de vérifier que la condition indiquée est vraie. Ici, si la condition est vraie c’est-à-dire PileVide() est faux, le programme se poursuit sinon, il s’arrête. o Une autre possibilité est de prévoir dans la fonction Depiler() et Sommet_De_Pile(), une variable booléenne qui indique si la fonction a réussi ou échoué. Cette variable sera testée à chaque retour de l’appel de la fonction. mardi 4 octobre 2016LANDRY CHAPWOUO - 8INF259 15

Implantation par tableau o Pour utiliser la fonction assert() dans un programme, il faut inclure le fichier. o Il en est de même pour la fonction Empiler(), il serait préférable de prévoir une variable qui indiquera au programme appelant si la pile est pleine ou pas, ceci permettra au programme appelant d’effectuer les actions nécessaires dans un pareil cas. o Il faut cependant noter que la contrainte de pile pleine n’est pas une contrainte liée à la structure de donnée pile. o Théoriquement, il n’y a pas de limite sur le nombre d’éléments d’une pile. En pratique, son implantation dans un tableau limite le nombre d’éléments à Taille. mardi 4 octobre 2016LANDRY CHAPWOUO - 8INF259 16

Exemple d’utilisation de la classe Pile o On considère un programme qui lit 5 entiers, les empile dans une pile et les affiche. #include using namespace std ; #include "Pile.h" int main () { int n ; Pile pile1(5) ; // 5 est la taille de la pile cout << "Entrez 5 entiers : " ; for ( int i = 1; i <= 5; i++ ) mardi 4 octobre 2016LANDRY CHAPWOUO - 8INF259 17

Exemple d’utilisation de la classe Pile { cin >> n ; pile1.Empiler(n) ; // remplissage de la pile } while ( !pile1.PileVide() ) // affichage des éléments de la pile cout << pile1.Depiler() << " " << endl ; return 0 ; } mardi 4 octobre 2016LANDRY CHAPWOUO - 8INF259 18

Implantation par liste chaînée o L’implantation d’une pile par une liste (simplement) chaînée est une version simplifiée de celle d’une liste par liste chaînée. template class Pile { private: noeud * top; // sommet de la pile int size; // nombre d’élément dans la pile public: Pile () // constructeur { top = NULL; size = 0; } mardi 4 octobre 2016LANDRY CHAPWOUO - 8INF259 19

Implantation par liste chaînée ~Pile() { clear(); } // Destructeur void clear() { while (top != NULL) { // Delete link nodes noeud * temp = top; top = top->suivant; delete temp; } size = 0; } mardi 4 octobre 2016LANDRY CHAPWOUO - 8INF259 20

Implantation par liste chaînée bool push(const Elem& item) { top = new noeud(item,top); size++; return true; } bool pop(Elem& it) { if (size == 0) return false; it = top->element; noeud * ltemp = top->suivant; mardi 4 octobre 2016LANDRY CHAPWOUO - 8INF259 21

Implantation par liste chaînée delete top; top = ltemp; size--; return true; } bool sommet_pile(Elem& it) const { if (size == 0) return false; it = top->element; return true; } int length() const { return size; } // retourne la taille de la pile }; mardi 4 octobre 2016LANDRY CHAPWOUO - 8INF259 22

Comparaison des deux implantations o Toutes les implantations des opérations d’une pile utilisant un tableau ou une liste chaînée prennent un temps constant i.e. en O(1). o Par conséquent, d’un point de vue d’efficacité, aucune des deux implantations n’est mieux que l’autre. o D’un point de vue de complexité spatiale, le tableau doit déclarer une taille fixe initialement. Une partie de cet espace est perdue quand la pile n’est pas bien remplie. o La liste peut augmenter ou rapetisser au besoin mais demande un extra espace pour mémoriser les adresses des pointeurs. mardi 4 octobre 2016LANDRY CHAPWOUO - 8INF259 23

Quelques applications des piles 1. Reconnaissance syntaxique : Soit une chaîne de caractères définie par la règle suivante : o Une chaîne quelconque S suivie du caractère *, suivi de la chaîne S inversée. o Exemple abc*cba o La chaîne peut contenir n’importe quel caractère alphanumérique. La chaîne se termine par le marqueur fin de ligne. Conception : Pour déterminer si la chaîne est légale, il faut : o Lire jusqu’à ‘*’ les caractères un à un en les empilant dans une pile. o Après ‘*’, jusqu’à la fin de la chaîne, lire un caractère, dépiler le caractère au sommet de la pile et comparer les deux, s’ils ne sont pas égaux, la chaîne est invalide. o Si tous les caractères sont égaux et que la pile s’est vidée, la chaîne est valide. o Une autre application est celle de la vérification du nombre de parenthèses ouvrante et fermantes dans une expression arithmétique. mardi 4 octobre 2016LANDRY CHAPWOUO - 8INF259 24

Quelques applications des piles o 2. Calcul arithmétique : o L'ordre dans la pile permet d'éviter l'usage des parenthèses. o La notation postfixée (polonaise) consiste à placer les opérandes devant l'opérateur. o La notation infixée (parenthèse) consiste à entourer les opérateurs par leurs opérandes. o Les parenthèses sont nécessaires uniquement en notation infixée. o Certaines règles permettent d'en réduire le nombre (priorité de la multiplication par rapport à l'addition, en cas d'opérations unaires représentées par un caractère spécial (-, !,...). mardi 4 octobre 2016LANDRY CHAPWOUO - 8INF259 25

Quelques applications des piles o Détaillons ici la saisie et l'évaluation d'une expression postfixée: o La notation usuelle, comme (3 + 5) * 2, est dite infixée. o Son défaut est de nécessiter l'utilisation de parenthèses pour éviter toute ambiguïté (ici, avec 3 + (5 * 2)). o Pour éviter les parenthéses, il est possible de transformer une expression infixée en une expression postfixée en faisant "glisser« les opérateurs arithmétiques à la suite des expressions auxquelles ils s'appliquent. mardi 4 octobre 2016LANDRY CHAPWOUO - 8INF259 26

Quelques applications des piles o Exemple: o (3 + 5) * 2 s'écrira en notation postfixée (notation polaise): * o alors que 3 + (5 * 2) s'écrira: * + o Notation infixe: A * B/C. En notation postfixe est: AB * C/. o On voit que la multiplication vient immédiatement après ses deux opérandes A et B. o Imaginons maintenant que A * B est calculé et stocké dans T. o Alors la division / vient juste après les deux arguments T et C. o Forme infixe: A/B ** C + D * E - A * C (** étant l’opérateur d’exponentiation) o Forme postfixe: ABC ** /DE * + AC * - mardi 4 octobre 2016LANDRY CHAPWOUO - 8INF259 27

Résumé mardi 4 octobre 2016LANDRY CHAPWOUO - 8INF259 28

Résumé mardi 4 octobre 2016LANDRY CHAPWOUO - 8INF259 29

Discussion mardi 4 octobre 2016LANDRY CHAPWOUO - 8INF259 30