• Aucun résultat trouvé

structure de pile

N/A
N/A
Protected

Academic year: 2022

Partager "structure de pile"

Copied!
45
0
0

Texte intégral

(1)

La structure de pile Exercices Implantation d’une pile Annexes

Structure de pile

Judicaël Courant

2018-W47-4 (22 novembre)

(2)

La structure de pile Exercices Implantation d’une pile Annexes

Motivations Structure de pile

1 La structure de pile Motivations Structure de pile 2 Exercices

3 Implantation d’une pile 4 Annexes

(3)

La structure de pile Exercices Implantation d’une pile Annexes

Motivations Structure de pile

Introduction

Il existe de nombreux algorithmes dans lesquels on veut manipuler des ensembles d’objets.

Objectif

L’objectif de ce cours est de montrer :

qu’un même besoin se retrouve dans plusieurs problèmes de programmation ;

une notion, appelée structure de pilequi répond à ces besoins ; comment implanter et utiliser une structure de pile.

(4)

La structure de pile Exercices Implantation d’une pile Annexes

Motivations Structure de pile

Fonction «retour arrière» d’un navigateur web

Un navigateur web doit stocker les URL des dernières pages visitées pour proposer la fonction «retour arrière».

(5)

La structure de pile Exercices Implantation d’une pile Annexes

Motivations Structure de pile

Besoins

Garder en mémoire un ensemble d’URL ;

Ajouter une nouvelle URL (quand on va sur une nouvelle page) ;

Récupérer la dernière adresse mise ;

Enlever la dernière adresse mise (l’avant-dernière devient alors la dernière, etc.).

(6)

La structure de pile Exercices Implantation d’une pile Annexes

Motivations Structure de pile

Fonction «annuler» d’un traitement de texte

Objectif : permettre de revenir à un état antérieur du document en cours d’édition.

Besoins :

Garder un ensemble d’état du document/d’actions effectuées ; Ajouter un élément à cet ensemble (quand on modifie le document) ;

Récupérer le dernier état du document/la dernière action effectuée ;

Enlever le dernier état du document/la dernière action effectuée (lorsqu’on annule une commande).

(7)

La structure de pile Exercices Implantation d’une pile Annexes

Motivations Structure de pile

Un besoin commun

On retrouve dans ces exemples lesmêmes besoins : stocker un ensemble de données ;

ajouter un élément à l’ensemble ; récupérer le dernier élément mis ; enlever le dernier élément mis.

(8)

La structure de pile Exercices Implantation d’une pile Annexes

Motivations Structure de pile

Objectif

Objectif : programmerune seule foisde quoi répondre à ces besoins.

Modifier un programme pour une nouvelle situation est : compliqué ;

long ;

risqué (bugs) ; coûteux.

Le Saint-Graal de la programmation

Ne programmer qu’une seule fois ce qui correspond à un seul concept.

(9)

La structure de pile Exercices Implantation d’une pile Annexes

Motivations Structure de pile

1 La structure de pile Motivations Structure de pile

2 Exercices

3 Implantation d’une pile 4 Annexes

(10)

La structure de pile Exercices Implantation d’une pile Annexes

Motivations Structure de pile

Notion de structure de données

On aimerait avoir unestructure de données répondant à ces besoins, c’est-à-dire

un type de données (un type d’objet Python) ; muni d’opérations répondant à nos besoins Définition

Structure de données=type +opérations sur ce type.

(11)

La structure de pile Exercices Implantation d’une pile Annexes

Motivations Structure de pile

La structure de pile

Opérations requises similaires à celles offertes par une pile d’assiettes :

stocker des assiettes ; ajouter une assiette ;

voir la dernière assiette ajoutée ; enlever la dernière assiette.

(12)

La structure de pile Exercices Implantation d’une pile Annexes

Motivations Structure de pile

Définition

Unestructure de pileest une structure de données dont les opérations sont :

1 creer() crée et retourne une nouvelle pile, initialement vide (en anglais : create()) ;

2 empiler(x, p)empile la valeurx sur la pilep(push(x, p)) ;

3 est_vide(p) retourneTrue si la pile est vide,False dans le cas contraire (is_empty(p)) ;

4 depiler(t)retourne la valeur située au sommet de la pile et l’enlève du sommet de la pile (pop(p)). Comportement non spécifié si la pile est vide.

5 Parfois : sommet(p)retournant la valeur située au sommet de la pile (top(p)).

(13)

La structure de pile Exercices Implantation d’une pile Annexes

Motivations Structure de pile

Remarques

Différentes façons d’implanter cette structure de pile.

In english : stackstructure /Last In First Out structure (LIFO structure).

(14)

La structure de pile Exercices Implantation d’une pile Annexes

Motivations Structure de pile

Des piles partout

dans tout ordinateur, pour gérer les appels de fonctions, on garde une pile des variables locales et des adresses de retour ; dans les calculatrices en notation polonaise inversée

(explication, intérêt des calculatrices en NPL) ; dans le langage Postscript (devenu PDF) ;

fonctionnalités du type «annuler» (tableur, éditeur d’image, etc.)

(15)

La structure de pile Exercices Implantation d’une pile Annexes

Chaînes bien parenthésées Calculatrice en polonaise inversée Percolation

1 La structure de pile

2 Exercices

Chaînes bien parenthésées Calculatrice en polonaise inversée Percolation

3 Implantation d’une pile 4 Annexes

(16)

La structure de pile Exercices Implantation d’une pile Annexes

Chaînes bien parenthésées Calculatrice en polonaise inversée Percolation

Cadre

On considère une chaîne de caractères, contenant divers caractères, dont possiblement(,),[ et].

Objectif

Vérifier que cette chaîne estbien parenthésée.

(17)

La structure de pile Exercices Implantation d’une pile Annexes

Chaînes bien parenthésées Calculatrice en polonaise inversée Percolation

Spécification du problème

Est définie comme «bien parenthésée» toute chaînes vérifiant l’une des conditions suivantes :

1 s ne contient aucune parenthèse ni crochet ;

2 s commence respectivement par ( ou [ et finit respectivement par ) ou ] ets[1:-1] est bien parenthésée ;

3 s est la concaténation de deux chaînes bien parenthésées.

Exemples

Bien parenthésée "(salut) [com[ment (vas-())]]tu ?"

Mal parenthésées "(salut]" et")salut("

(18)

La structure de pile Exercices Implantation d’une pile Annexes

Chaînes bien parenthésées Calculatrice en polonaise inversée Percolation

Énoncé

Écrire une fonctionbienparenthesee(s)retournant Truesis est bien parenthésée etFalsesinon.

(On supposera qu’on dispose d’une structure de pile.)

(19)

La structure de pile Exercices Implantation d’une pile Annexes

Chaînes bien parenthésées Calculatrice en polonaise inversée Percolation

1 La structure de pile

2 Exercices

Chaînes bien parenthésées Calculatrice en polonaise inversée Percolation

3 Implantation d’une pile 4 Annexes

(20)

La structure de pile Exercices Implantation d’une pile Annexes

Chaînes bien parenthésées Calculatrice en polonaise inversée Percolation

Description du problème

Objectif : simuler une calculatrice en polonaise inversée.

Étant donné

une chaîne de caractères décrivant des calculs à effectuer (ex.

«3 2 5 + *») ;

une pile contenant déjà des valeurs ;

elle retourne la pile après exécution des ordres donnés.

(21)

La structure de pile Exercices Implantation d’une pile Annexes

Chaînes bien parenthésées Calculatrice en polonaise inversée Percolation

Précisions

Pour simplifier, on considérera qu’il y a toujours des blancs entre les arguments ou opérations dans la chaîne de caractères à exécuter.

On veut pouvoir disposer des nombres flottants, des quatre opérations, de la mise à la puissance et de la racine carrée (sqrt).

(22)

La structure de pile Exercices Implantation d’une pile Annexes

Chaînes bien parenthésées Calculatrice en polonaise inversée Percolation

1 La structure de pile

2 Exercices

Chaînes bien parenthésées Calculatrice en polonaise inversée Percolation

3 Implantation d’une pile 4 Annexes

(23)

La structure de pile Exercices Implantation d’une pile Annexes

Chaînes bien parenthésées Calculatrice en polonaise inversée Percolation

Percolation

(24)

La structure de pile Exercices Implantation d’une pile Annexes

Introduction

Avec des tableaux statiques

Implantation avec des tableaux dynamiques Implantations objet

1 La structure de pile 2 Exercices

3 Implantation d’une pile Introduction

Avec des tableaux statiques

Implantation avec des tableaux dynamiques Implantations objet

4 Annexes

(25)

La structure de pile Exercices Implantation d’une pile Annexes

Introduction

Avec des tableaux statiques

Implantation avec des tableaux dynamiques Implantations objet

Objectif

Nous avonsspécifié ce qu’était une structure de pile. Reste à voir comment l’implanter, c’est-à-dire la réaliser concrêtement.

(26)

La structure de pile Exercices Implantation d’une pile Annexes

Introduction

Avec des tableaux statiques

Implantation avec des tableaux dynamiques Implantations objet

1 La structure de pile 2 Exercices

3 Implantation d’une pile Introduction

Avec des tableaux statiques

Implantation avec des tableaux dynamiques Implantations objet

4 Annexes

(27)

La structure de pile Exercices Implantation d’une pile Annexes

Introduction

Avec des tableaux statiques

Implantation avec des tableaux dynamiques Implantations objet

Introduction

On représente une pile par un tableaut.t[0]est la première valeur empilée,t[1] la deuxième, etc.

Pour savoir quelle est la dernière, on garde le compte du nombre d’éléments du tableau.

Conceptuellement, une pile sera donc un couple d’un tableau et du nombre de cases utilisées dans ce tableau.

(28)

La structure de pile Exercices Implantation d’une pile Annexes

Introduction

Avec des tableaux statiques

Implantation avec des tableaux dynamiques Implantations objet

Implantation Python

On veut pouvoir modifier le nombre d’éléments, donc on prendra un tableau à deux composantes : la première sera un tableau, la seconde l’index :

TAILLE_MAX = 1000 def cree():

"""Crée une nouvelle pile"""

t = [None] * TAILLE_MAX return [t, 0]

def est_vide(p):

"""Retourne True si la pile est vide, False sinon"""

return p[1] == 0

(29)

La structure de pile Exercices Implantation d’une pile Annexes

Introduction

Avec des tableaux statiques

Implantation avec des tableaux dynamiques Implantations objet

Implantation Python (suite)

def empile(x, p):

"""Empile x sur la pile p.

Précondition : p de taille au plus TAILLE_MAX-1."""

t = p[0]

i = p[1]

t[i] = x p[1] = i+1

(30)

La structure de pile Exercices Implantation d’une pile Annexes

Introduction

Avec des tableaux statiques

Implantation avec des tableaux dynamiques Implantations objet

Implantation en Python (fin)

def depile(p):

"""Dépile le sommet de p et le retourne.

Précondition: p doit être non-vide."""

t = p[0]

i = p[1]

p[1] = i-1 return t[i-1]

(31)

La structure de pile Exercices Implantation d’une pile Annexes

Introduction

Avec des tableaux statiques

Implantation avec des tableaux dynamiques Implantations objet

Complexité

Quelle est la complexité des opérations ?

(32)

La structure de pile Exercices Implantation d’une pile Annexes

Introduction

Avec des tableaux statiques

Implantation avec des tableaux dynamiques Implantations objet

1 La structure de pile 2 Exercices

3 Implantation d’une pile Introduction

Avec des tableaux statiques

Implantation avec des tableaux dynamiques Implantations objet

4 Annexes

(33)

La structure de pile Exercices Implantation d’une pile Annexes

Introduction

Avec des tableaux statiques

Implantation avec des tableaux dynamiques Implantations objet

Introduction

Python propose des tableauxdynamiques, c’est-à-dire des tableaux auxquels on peut ajouter ou enlever des éléments (en fin de tableau).

Ces tableaux permettent trivialement de construire une structure de pile.

(34)

La structure de pile Exercices Implantation d’une pile Annexes

Introduction

Avec des tableaux statiques

Implantation avec des tableaux dynamiques Implantations objet

Implantation Python

TAILLE_MAX = 1000 def cree():

"""Crée une nouvelle pile"""

return []

def est_vide(p):

"""Retourne True si la pile est vide, False sinon"""

return len(p) == 0

(35)

La structure de pile Exercices Implantation d’une pile Annexes

Introduction

Avec des tableaux statiques

Implantation avec des tableaux dynamiques Implantations objet

Implantation Python (2)

def empile(x, p):

"""Empile x sur la pile p."""

p.append(x)

(36)

La structure de pile Exercices Implantation d’une pile Annexes

Introduction

Avec des tableaux statiques

Implantation avec des tableaux dynamiques Implantations objet

Implantation Python (3)

def depile(p):

"""Dépile le sommet de p et le retourne."""

return p.pop()

(37)

La structure de pile Exercices Implantation d’une pile Annexes

Introduction

Avec des tableaux statiques

Implantation avec des tableaux dynamiques Implantations objet

Complexité

Complexité des opérations ?

(38)

La structure de pile Exercices Implantation d’une pile Annexes

Introduction

Avec des tableaux statiques

Implantation avec des tableaux dynamiques Implantations objet

Remarques

L’implantation sous forme de tableaux dynamiques :

1 est plus simple. . .

2 . . . car la difficulté est cachée dans l’implantation des tableaux dynamiques ;

3 sera privilégiée en Python puisque Python fournit des tableaux dynamiques.

Attention

Il faut connaître l’implantation avec tableaux statiques, certains langages n’offrant pas de tableaux dynamiques.

(39)

La structure de pile Exercices Implantation d’une pile Annexes

Introduction

Avec des tableaux statiques

Implantation avec des tableaux dynamiques Implantations objet

1 La structure de pile 2 Exercices

3 Implantation d’une pile Introduction

Avec des tableaux statiques

Implantation avec des tableaux dynamiques Implantations objet

4 Annexes

(40)

La structure de pile Exercices Implantation d’une pile Annexes

Introduction

Avec des tableaux statiques

Implantation avec des tableaux dynamiques Implantations objet

Motivation

Dans l’implantation avec tableaux statiques

p[0]est le tableau des données alors que p[1]est la taille de la pile, ce qui ne facilite pas la lecture du code.

En Python on peut faire en sorte que le nombre d’éléments soit noté p.tailleet le tableaup.donnees en utilisant des classeset des objets.

On définit une classePile, avec

desattributs tailleetdonnees stockant respectivement le tableau des données et la taille de la pile ;

des méthodes est_vide,empile,depileeffectuant les opérations de test, d’empilement et de dépilement vues plus haut.

une méthode spéciale __init__pour créer une pile vide.

(41)

La structure de pile Exercices Implantation d’une pile Annexes

Introduction

Avec des tableaux statiques

Implantation avec des tableaux dynamiques Implantations objet

Implantation objet (code)

class Pile:

def __init__(self):

self.donnees = [None] * TAILLE_MAX self.taille = 0

def est_vide(self):

return self.taille == 0 def empile(self, x):

self.donnees[self.taille] = x self.taille += 1

def depile(self):

self.taille -= 1

return self.donnees[self.taille]

(42)

La structure de pile Exercices Implantation d’une pile Annexes

Introduction

Avec des tableaux statiques

Implantation avec des tableaux dynamiques Implantations objet

Implantation objet (utilisation)

Après ces définitions, on peut utiliser la classe pile comme suit :

# création:

p = Pile()

# empiler une valeur : p.empile(11)

# tester si la pile est vide : p.est_vide()

# dépiler : p.depile()

# on peut même accéder aux attributs de p : p.donnees

p.taille = 0 # (on vide la pile)

(43)

La structure de pile Exercices Implantation d’une pile Annexes

Introduction

Avec des tableaux statiques

Implantation avec des tableaux dynamiques Implantations objet

Note

Les notions d’objet et de classe : sont omniprésente en Python ; existent dans de nombreux langages ;

n’imposent pas une structure de donnée plutôt qu’une autre (tableaux statiques ou dynamiques).

(44)

La structure de pile Exercices Implantation d’une pile Annexes

Crédits photographiques

Capture d’écran d’un navigateur web par l’auteur, dans lequel peut être vu une partie de la photo Stack of books de Sam Howzit, sous licence Creative Commons Attribution 2.0 Generic (http://ur1.ca/iv6xo).

Exercice sur la percolation : images tirées de Introduction to Programming in Java, Robert Sedgewick et Kevin Wayne, http://ur1.ca/ivfl3

(45)

La structure de pile Exercices Implantation d’une pile Annexes

Copyleft

Cette œuvre est libre, vous pouvez la copier, la diffuser et la modifier selon les termes de la Licence Art Libre

(http://www.artlibre.org).

Références

Documents relatifs

a) Décomposition de Dunford. Montrer que tout élément nilpotent est dans tout idéal premier. Soit f ∈ B, à quelle condition l’ensemble des idéaux de B qui ne rencontre

Our main results show that the mean number of vertices in open long cycles grows like V 1/3 , and that such cycles (when they exist) contain order of V 1/3 vertices. Moreover, we

– à créer la pile comme un objet récursif (une pile est vide ou bien constituée d'un élément qui est son sommet et d'une pile) … voir question a) ci-dessous ;. – à créer

Lors de la lecture séquentielle de l'expression à analyser, le caractère en cours d'analyse peut être : – une parenthèse ouvrante, il faut alors empiler cette parenthèse ;.. –

Anneau, traduit en français, n’a plus la connotation allemande et paraît bien orphelin entre le cartel d’entreprises et le corps d’armée.. (extrait de Les mots et les maths,

• Les mutants dont les statocytes contiennent une quantité réduite d'amidon dans les amyloplastes ont une croissance tout à fait normale, mais sont moins sensibles au

creer() crée et retourne une nouvelle pile, initialement vide (en anglais : create()) ; 2. est_vide(p) retourne True si la pile est vide, False dans le cas contraire (is_empty(p))

L’ARN Messager : l’acide ribonucléique messager, ou ARN m, est une copie de l’ADN utilisée par les cellules pour fabriquer