Nous avons abordé le concept de Structure de Données Abstraite, et nous avons vu comment, avec un jeu minimal de primitive, nous pouvons manipuler une LISTE.
Rapellons les primitives utilisées :
- cree_vide() : création d'une LISTE vide notée []
- est_vide(liste) : True si la liste est vide et False sinon
- ajouter(x,liste) ajouter un élément en tête
- donne_tete(liste) : renvoi la tête
- donne_queue(liste) : renvoi la queue qui est aussi une LISTE
Commençons par cree_vide(). Ce n'est pas très difficile, cette fonction renvoie simplement une liste vide !
Maintenant la primitive ajouter().
Maintenant la primitive est_vide().
Là encore c'est très simple...
Et pour terminer, donne_tete et donne_queue
Avec la POO
La POO est un moyen très adapté pour créer des interfaces très faciles à utiliser. Vous allez créer une interface assez similaire aux 2 précédentes, mais utilisant le paradigme de la POO.
On va créer une classe Liste. Les objets Liste auront 1 seul attribut, nommé contenu. Lors de l'instanciation, cet attribut prendra la valeur [].
Ajoutez dans votre classe (que vous recopierez) une méthode isempty qui renvoie True si la liste est vide et False sinon.
Pour ajouter des éléments nous n'allons pas créer une méthode ajouter.
En fait nous voudrions ajouter des éléments ainsi :
l1 = Liste() -> l1.contenu = [] l2 = Liste(3, l1) # ajoute 3 dans l1 -> l2.contenu = [3] l3 = Liste(4, l2) # ajoute 3 dans l2 -> l3.contenu = [4, 3] l4 = Liste(1, l3) # ajoute 3 dans l3-> l4.contenu = [1, 4, 3] En mode empilé : l = Liste(5, Liste(3, Liste(4, Liste() ) ) -> l.contenu = [5, 3, 4]Cela pose un problème : lors de l'instanciation, on écrit l = Liste() sans arguments, tandis que quand on ajoute un élément, on écrit : l = Liste(x, liste), avec 2 arguments. Or, ces 2 instructions appellent la même fonction : le constructeur __init__.
Donc ce constructeur devrait avoir 0 paramètres si on instancie, et 2 paramètres si on ajoute. Cela est possible, en ajoutant des arguments optionnels ayant une valeur par défaut.
Toutefois, le constructeur ainsi modifié est assez complexe, le voici, vous n'avez pas à l'écrire, mais nous allons le commenter pour le comprendre.
Il s'agit de simples getters, vous pouvez les implémenter.
- get_tete doit renvoyer contenu[0] si la liste est non vide, et [] sinon
- get_queue doit renvoyer contenu[1:] si la liste contient au moins 2 éléments (une tête et une queue non vide) et [] sinon