|
|
|
#!/usr/bin/env python3
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
|
|
|
Created on Tue Sep 22 20:44:35 2020
|
|
|
|
|
|
|
|
@author: manu
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
class Maillon:
|
|
|
|
"""Un maillon d'une liste chaînée."""
|
|
|
|
def __init__(self, valeur, suivant):
|
|
|
|
self.valeur = valeur
|
|
|
|
self.suivant = suivant
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
"""Renvoie une chane de caractères représentant le maillon."""
|
|
|
|
return str(self.valeur)
|
|
|
|
|
|
|
|
|
|
|
|
class ListeChaine:
|
|
|
|
"""Une liste chaînée."""
|
|
|
|
def __init__(self, tete=None):
|
|
|
|
"""Crée une liste vide, ou une liste dont la tete (un maillon)
|
|
|
|
est donnée."""
|
|
|
|
self.__tete = tete
|
|
|
|
|
|
|
|
def est_vide(self):
|
|
|
|
"""Indique si la liste est vide."""
|
|
|
|
return self.__tete is None
|
|
|
|
|
|
|
|
def tete(self):
|
|
|
|
"""Renvoie la valeur du premier élément de la liste."""
|
|
|
|
if self.est_vide():
|
|
|
|
raise IndexError("La liste vide n'a pas de tête")
|
|
|
|
return self.__tete.valeur
|
|
|
|
|
|
|
|
def queue(self):
|
|
|
|
"""Renvoie la queue de la liste."""
|
|
|
|
if self.est_vide():
|
|
|
|
raise IndexError("La liste vide n'a pas de queue")
|
|
|
|
return ListeChaine(self.__tete.suivant)
|
|
|
|
|
|
|
|
def ajoute(self, valeur):
|
|
|
|
"""ajoute `valeur` en tête de la liste."""
|
|
|
|
self.__tete = Maillon(valeur, self.__tete)
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
"""Renvoie une chaîne de caractères représentant la liste."""
|
|
|
|
maillon = self.__tete
|
|
|
|
s = ''
|
|
|
|
while maillon is not None:
|
|
|
|
s = s + str(maillon.valeur)
|
|
|
|
maillon = maillon.suivant
|
|
|
|
if maillon is not None:
|
|
|
|
s += '->'
|
|
|
|
return s
|
|
|
|
|
|
|
|
def __len__(self):
|
|
|
|
"""Renvoie la longueur de la liste."""
|
|
|
|
maillon = self.__tete
|
|
|
|
long = 0
|
|
|
|
while maillon is not None:
|
|
|
|
long = long + 1
|
|
|
|
maillon = maillon.suivant
|
|
|
|
return long
|
|
|
|
|
|
|
|
def __getitem__(self, n):
|
|
|
|
"""Renvoie l'élément d'indice n de la liste."""
|
|
|
|
maillon = self.__tete
|
|
|
|
i = 0
|
|
|
|
while i < n and maillon is not None:
|
|
|
|
i = i + 1
|
|
|
|
maillon = maillon.suivant
|
|
|
|
if maillon is None or n < 0:
|
|
|
|
raise IndexError("Indice non valide")
|
|
|
|
return maillon.valeur
|
|
|
|
|
|
|
|
def __add__(self, other):
|
|
|
|
"""Renvoie la liste correspondant à la concaténation des 2 listes."""
|
|
|
|
if self.est_vide():
|
|
|
|
return other
|
|
|
|
v = self.tete()
|
|
|
|
q = self.queue()
|
|
|
|
return ListeChaine(Maillon(v, (q + other).__tete))
|
|
|
|
|
|
|
|
def reverse(self):
|
|
|
|
"""Renvoie une liste correspondant à la liste renversée."""
|
|
|
|
res = ListeChaine()
|
|
|
|
maillon = self.__tete
|
|
|
|
while maillon is not None:
|
|
|
|
res.ajoute(maillon.valeur)
|
|
|
|
maillon = maillon.suivant
|
|
|
|
return res
|
|
|
|
|
|
|
|
|
|
|
|
class Pile_lst:
|
|
|
|
"""Implémentation d'une pile par une liste."""
|
|
|
|
def __init__(self):
|
|
|
|
"""Crée une pile vide."""
|
|
|
|
self.__pile = []
|
|
|
|
|
|
|
|
def est_vide(self):
|
|
|
|
"""Indique si la pile est vide."""
|
|
|
|
return self.__pile == []
|
|
|
|
|
|
|
|
def empiler(self, valeur):
|
|
|
|
"""Empile la valeur."""
|
|
|
|
self.__pile.append(valeur)
|
|
|
|
|
|
|
|
def depiler(self):
|
|
|
|
"""Dépile le sommet de la pile et le renvoie."""
|
|
|
|
return self.__pile.pop()
|
|
|
|
|
|
|
|
def taille(self):
|
|
|
|
"""Renvoie la taille de la pile."""
|
|
|
|
return len(self.__pile)
|
|
|
|
|
|
|
|
def sommet(self):
|
|
|
|
"""Renvoie le sommet de la pile (sans le dépiler)."""
|
|
|
|
return self.__pile[-1]
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
s = "|"
|
|
|
|
for val in self.__pile:
|
|
|
|
s = str(val) + "->" + s
|
|
|
|
return s
|
|
|
|
|
|
|
|
|
|
|
|
class Pile_chaine:
|
|
|
|
"""Implémentation d'une pile par une liste chaînée."""
|
|
|
|
def __init__(self):
|
|
|
|
"""Crée une pile vide."""
|
|
|
|
self.__pile = ListeChaine()
|
|
|
|
self.__taille = 0
|
|
|
|
|
|
|
|
def est_vide(self):
|
|
|
|
"""Indique si la pile est vide."""
|
|
|
|
return self.__taille == 0
|
|
|
|
|
|
|
|
def empiler(self, valeur):
|
|
|
|
"""Empile la valeur."""
|
|
|
|
self.__pile.ajoute(valeur)
|
|
|
|
self.__taille += 1
|
|
|
|
|
|
|
|
def depiler(self):
|
|
|
|
"""Dépile le sommet de la pile et le renvoie."""
|
|
|
|
if self.est_vide():
|
|
|
|
raise IndexError("Impossible de dépiler une pile vide.")
|
|
|
|
valeur = self.__pile.tete()
|
|
|
|
self.__pile = self.__pile.queue()
|
|
|
|
self.__taille -= 1
|
|
|
|
return valeur
|
|
|
|
|
|
|
|
def taille(self):
|
|
|
|
"""Renvoie la taille de la pile."""
|
|
|
|
return self.__taille
|
|
|
|
|
|
|
|
def sommet(self):
|
|
|
|
"""Renvoie le sommet de la pile (sans le dépiler)."""
|
|
|
|
if self.est_vide():
|
|
|
|
raise IndexError("Une pile vide n'a pas de sommet.")
|
|
|
|
return self.__pile.tete()
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
return str(self.__pile) + "->|"
|
|
|
|
|
|
|
|
|
|
|
|
class File_lst:
|
|
|
|
"""Implémentation d'une file par une liste."""
|
|
|
|
def __init__(self):
|
|
|
|
"""Crée une file vide."""
|
|
|
|
self.__file = []
|
|
|
|
|
|
|
|
def est_vide(self):
|
|
|
|
"""Indique si la file est vide."""
|
|
|
|
return self.__file == []
|
|
|
|
|
|
|
|
def enfiler(self, valeur):
|
|
|
|
"""Enfile l'élément valeur."""
|
|
|
|
self.__file.append(valeur)
|
|
|
|
|
|
|
|
def defiler(self):
|
|
|
|
"""Défile la tête de la file et la renvoie."""
|
|
|
|
return self.__file.pop(0)
|
|
|
|
|
|
|
|
def taille(self):
|
|
|
|
"""Renvoie la taille de la file."""
|
|
|
|
return len(self.__file)
|
|
|
|
|
|
|
|
def tete(self):
|
|
|
|
"""Renvoie la tête de la file (sans la défiler)."""
|
|
|
|
return self.__file[0]
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
s = "tete->"
|
|
|
|
for val in self.__file:
|
|
|
|
s += str(val) + "->"
|
|
|
|
return s + "queue"
|
|
|
|
|
|
|
|
|
|
|
|
class Maillon_db:
|
|
|
|
"""Un maillon d'une liste doublement chaînée."""
|
|
|
|
def __init__(self, precedent, valeur, suivant):
|
|
|
|
self.valeur = valeur
|
|
|
|
self.precedent = precedent
|
|
|
|
self.suivant = suivant
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
return str(self.valeur)
|
|
|
|
|
|
|
|
|
|
|
|
class File_chaine:
|
|
|
|
"""Implémentation d'une file par une liste doublement chaînée."""
|
|
|
|
def __init__(self):
|
|
|
|
"""Crée une file vide."""
|
|
|
|
self.__debut = self.__fin = None
|
|
|
|
self.__taille = 0
|
|
|
|
|
|
|
|
def __iter__(self):
|
|
|
|
return self
|
|
|
|
|
|
|
|
def __next__(self):
|
|
|
|
if self.est_vide():
|
|
|
|
raise StopIteration
|
|
|
|
return self.defiler()
|
|
|
|
|
|
|
|
def est_vide(self):
|
|
|
|
"""Indique si la file est vide."""
|
|
|
|
return self.__taille == 0
|
|
|
|
|
|
|
|
def enfiler(self, valeur):
|
|
|
|
"""Enfile l'élément valeur."""
|
|
|
|
maillon = Maillon_db(self.__fin, valeur, None)
|
|
|
|
if self.est_vide():
|
|
|
|
self.__debut = self.__fin = maillon
|
|
|
|
else:
|
|
|
|
self.__fin.suivant = maillon
|
|
|
|
self.__fin = maillon
|
|
|
|
self.__taille += 1
|
|
|
|
|
|
|
|
def defiler(self):
|
|
|
|
"""Défile la tête de la file et la renvoie."""
|
|
|
|
if self.est_vide():
|
|
|
|
raise IndexError("Impossible de défiler une file vide.")
|
|
|
|
valeur = self.__debut.valeur
|
|
|
|
self.__taille -= 1
|
|
|
|
if self.est_vide():
|
|
|
|
self.__debut = self.__fin = None
|
|
|
|
else:
|
|
|
|
self.__debut = self.__debut.suivant
|
|
|
|
self.__debut.precedent = None
|
|
|
|
return valeur
|
|
|
|
|
|
|
|
def taille(self):
|
|
|
|
"""Renvoie la taille de la file."""
|
|
|
|
return self.__taille
|
|
|
|
|
|
|
|
def tete(self):
|
|
|
|
"""Renvoie la tête de la file (sans la défiler)."""
|
|
|
|
if self.est_vide():
|
|
|
|
raise IndexError("Une file vide n'a pas de tête.")
|
|
|
|
return self.__debut.valeur
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
s = "tete->"
|
|
|
|
maillon = self.__debut
|
|
|
|
while maillon is not None:
|
|
|
|
s += str(maillon) + "->"
|
|
|
|
maillon = maillon.suivant
|
|
|
|
return s + "queue"
|
|
|
|
|
|
|
|
|
|
|
|
class Arbre:
|
|
|
|
def __init__(self, val) -> None:
|
|
|
|
self.val = val
|
|
|
|
self.gauche = None
|
|
|
|
self.droit = None
|
|
|
|
|
|
|
|
def insere_gauche(self, val) -> object:
|
|
|
|
"""insere un arbre gauche a la racine de l'arbre"""
|
|
|
|
nouvel_arbre = Arbre(val)
|
|
|
|
nouvel_arbre.gauche = self.gauche
|
|
|
|
self.gauche = nouvel_arbre
|
|
|
|
return nouvel_arbre
|
|
|
|
|
|
|
|
def insere_droit(self, val) -> object:
|
|
|
|
"""insere un arbre gauche a la racine de l'arbre"""
|
|
|
|
nouvel_arbre = Arbre(val)
|
|
|
|
nouvel_arbre.gauche = self.droit
|
|
|
|
self.droit = nouvel_arbre
|
|
|
|
return nouvel_arbre
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
f = File_lst()
|
|
|
|
print(f.est_vide())
|
|
|
|
f.enfiler('A')
|
|
|
|
f.enfiler('B')
|
|
|
|
f.enfiler('C')
|
|
|
|
print(f.est_vide())
|
|
|
|
print(f.tete())
|
|
|
|
print(f)
|
|
|
|
print(f.taille())
|
|
|
|
print(f.defiler())
|
|
|
|
print(f.defiler())
|
|
|
|
print(f.defiler())
|
|
|
|
print(f.est_vide())
|
|
|
|
lst = ListeChaine()
|
|
|
|
print(lst.est_vide())
|
|
|
|
lst.ajoute(306)
|
|
|
|
lst.ajoute(42)
|
|
|
|
lst.ajoute(205)
|
|
|
|
print(lst)
|
|
|
|
print(lst.est_vide())
|
|
|
|
print(lst[0])
|
|
|
|
print(lst[1])
|
|
|
|
print(len(lst))
|
|
|
|
lst2 = ListeChaine()
|
|
|
|
lst2.ajoute(18)
|
|
|
|
lst2.ajoute(45)
|
|
|
|
print(lst + lst2)
|
|
|
|
p = Pile_lst()
|
|
|
|
print(p.est_vide())
|
|
|
|
p.empiler('A')
|
|
|
|
p.empiler('B')
|
|
|
|
p.empiler('C')
|
|
|
|
print(p.est_vide())
|
|
|
|
print(p.sommet())
|
|
|
|
print(p)
|
|
|
|
print(p.taille())
|
|
|
|
print(p.depiler())
|
|
|
|
print(p.depiler())
|
|
|
|
print(p.depiler())
|
|
|
|
print(p.est_vide())
|