#PARTIE 
class File1 :
    
    def __init__(self,liste = []) :
        """
        Méthode d'initialisation
        param liste : (List) Liste d'élément à enfiler dès l'initialisation
        """
        self.file = liste
        
    def enfile(self,x) :
        """
        Méthode qui enfile un élément x
        param x : () Elément x à enfiler
        """
        self.file = [x] + self.file

    def defile(self) :
        """
        Méthode qui defile un élément de la file
        return : (bool/ ) False si impossible de retirer l'élément / Elément sinon
        """
        if not self.est_vide() :
            return self.file.pop()
        else :
            return False
        
    def est_vide(self):
        """
        Méthode testant la longueur de la file
        return : (bool) True si la file est vide, False sinon
        """
        return len(self.file) == 0
    
    def taille(self):
        """
        Méthode retournant la taille de la file
        return : (int) taille de la file
        """
        return len(self.file)
    
    def get_file(self):
        """
        Méthode retournant la file sous forme de liste pour en avoir un aperçu
        return : (list) file sous forme de list
        """
        return self.file
    
    # EXERCICE 2
    
    def ajout_element(self,element):
        """
        Fonction qui ajoute un élément, si la taille le permet.
        return (bool): Renvoie True si l'ajout de l'élément a eu lieu, False sinon
        """
        if file.taille() < 5 :
            file.enfile(fichier)
            return True
        else :
            return False
    
    def vide_file(self):
        """
        Fonction qui vide une file et affiche ces éléments
        """
        while file.est_vide() == False :
            e = file.defile()
            print(e)

# PARTIE 3 :

class File2 :

    def __init__(self,tete = None,queue = None):
        """
        Méthode d'initialisation
        param tete : () Element a mettre en tete de file
        param queue : (File) queue de la file (élements suivants)
        """
        self.tete = tete
        self.queue = queue
    
    def enfile(self,x) :
        """
        Méthode qui enfile un élément x
        param x : () Elément x à enfiler
        """
        self.queue = File2(self.tete,self.queue)
        self.tete = x
       
    def defile(self) :
        """
        Méthode qui defile un élément de la file
        return : (bool/ ) False si impossible de retirer l'élément / Elément sinon
        """
        if self.est_vide() :
            return False
        if self.queue == None  :
            val = self.tete
            self.tete = None
            return val
        elif self.queue.queue == None :
            val = self.queue.tete 
            self.queue = None
            return val
        else :
            return self.queue.defile()
    
    def est_vide(self) :
        """
        Méthode testant la longueur de la file
        return : (bool) True si la file est vide, False sinon
        """
        return self.queue == None and self.tete == None
    
    def taille(self):
        """
        Méthode retournant la taille de la file
        return : (int) taille de la file
        """
        if self.queue == None :
            return 1
        else :
            return 1 + self.queue.taille()
    
    def get_file(self):
        """
        Méthode retournant la file sous forme de liste pour en avoir un aperçu
        return : (list) file sous forme de list
        """
        if self.queue != None :
            return [self.tete] + self.queue.get_file()
        else :
            return [self.tete]
        

    
    
    