Filtre sur une pile

On donne une mise en œuvre simple de la structure de Pile avec les listes Python.

🐍 Script Python
class Pile:
    "Classe à ne pas modifier"
    def __init__(self, valeurs=None):
        """Initialise une pile
        - vide, si `valeurs` n'est pas fourni ;
        - remplie avec `valeurs` sinon.
            - Le sommet de la pile est à la fin de la liste.
        """
        if valeurs is None:
            self.valeurs = []
        else:
            self.valeurs = valeurs

    def est_vide(self):
        "Renvoie un booléen : la pile est-elle vide ?"
        return self.valeurs == []

    def __str__(self):
        "Affiche la pile, en indiquant le sommet"
        return "| " + " | ".join(map(str, self.valeurs)) + ' <- sommet'

    def depile(self):
        """
        - Si la pile est vide, provoque une erreur.
        - Sinon, dépile un élément au sommet et le renvoie.
        """
        if self.est_vide():
            raise ValueError("Erreur, pile vide")
        else:
            return self.valeurs.pop()

    def empile(self, element):
        "Empile un élément au sommet de la pile"
        self.valeurs.append(element)

Pour cet exercice, on n'utilisera que les méthodes de la classe Pile et non les méthodes des listes Python. À savoir, uniquement :

  • Avec pile qui est un objet de la classe Pile,
    • pile.empile(element) ; empile un element au sommet de pile,
    • pile.depile() ; dépile et renvoie element au sommet de pile qui est non vide.

Écrire une fonction filtre_positif qui prend en paramètre donnees de type Pile d'entiers et qui renvoie une pile qui contient les éléments positifs de donnees. La pile donnees doit être globalement inchangée.

Exemples
>>> donnees = Pile([4, -11, 7, -3, -1, 0, 6])
>>> print(filtre_positifs(donnees))
| 4 | 7 | 0 | 6 <- sommet
>>> print(donnees)
| 4 | -11 | 7 | -3 | -1 | 0 | 6 <- sommet
>>> donnees = Pile([1, 2, 3, 4])
>>> print(filtre_positifs(donnees))
| 1 | 2 | 3 | 4 <- sommet
>>> print(donnees)
| 1 | 2 | 3 | 4 <- sommet
>>> donnees = Pile([-4, -3, -2, -1])
>>> print(filtre_positifs(donnees))
|  <- sommet
>>> print(donnees)
| -4 | -3 | -2 | -1 <- sommet
###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10
.128013xA3SyVtbi,q6)f4_d7ugj[:khe8| sPar(5].lvow21/m+n0p;=c-E9050r0A0h0G0j0M0E0D0!0M0G0E0E0Z010h0j0X010406050E0t0T0T0G0H0f040e0O0M0t0{0O0V050S12141618100X041h1o051r0S1r1t1o100r0j0N0:0=0@0_0z0j0u0z0M1H0z0h0~050+0i0M0A1C0?0^011G1I1K1I0h1Q1S1O0h0i0O0r181P0H1p0h0z0:1b0E0X0G0V0_0Q011U1E010o0-0A0V0G0T0A1O1_1{201W231S26280~0a0D0F0H0O0X0O0E0j1e0V0D0)1@0H0H0A0!2t1h2b0V1p0S1=2G0h1:1/1;0r2d0_1K0V252q1O1z1B0;1V2Q0j2S0V1,1A1O0X2z1p2E2G2.111`2u2Y212%0H150M0~0D0R2D2=0 2;2c2@1W2_2{2}0Q301{322E2P01370G2|040D0d3b2F103e350_3h3j0D0p3n3d2=3f3t2}0J3x3p3z3r3g0O2`3i2}0m3E332?1D363J383k0s3O3q3R3s3T3L3k0B3X3G3Z3I3K3u0%3)343+3B040R0W3:3Q2Z3,3U0R2 1i313F3;3|3?0R3a413c433{2^3#3j0R3m493o3P3A4e0~0R3w4i3y444d3-4n3D4q4b4l4u3@3N4x4k3H463W4D3Y454m3@3(4I3*4K4A0R3/4O4s3S4A0Q3_4U4c4W3U0Q402.4y4F4L0Q484*4E3=4-4h4:4J4t4%4p4^4P4`3$0Q4w4}4V3!4X4C534#554%4H584z4%4N5d4,4X4T5h4=4A0d4Z5l4Q3U0d4)424;5r3$0d4/5v4_4$5y4@5B4~5D3j0d4|5G543}5y52311q2,1h2W2J0r2N3f0!1,291p5V1s5T2:4q055!0)2-5H0_0y0~353x5w210P2}5_5C3s0!0~0F245~5;010}040x3E0D6c0D5`1W5?040)0o655N5|3k6l59220T0~0q0q2#2s6u6p3f680I6z3H0i680E0A0M6k5,5 670~0k3x6e6M0V0~0N3i0A0t0H0E6D3+0O0~0Z6#3|680w0K0n6a4x6d6=6R666F0~6H6J6*216%040L6}366U6W6Y6!4q6@5N6 6)786f3s0i0~1K0E0h720_6B7l3g741S767o680n3E066=7e016h6j7o6n6e6L660V0o0~0A7j0q0N0j0)7t0~6C7G5N6_046{6K2:6M7u6:4*6?6d7z6h2z0h6Y1g7d6M7W7Y7o6 717U6q6T046V7r6Z6Q7z7b7c2.797|7g047i7k7{6A7S7v4x7x7*6M7B0A7Z5R6M7E7o0o6s046u7j0H6y8d3H7n8z3+7?6I8n3c7z7$6b7)873f0E1~04010c0o230!0z1T0=0D0X240k0D250D2#1z0l0t1{0h0D1S0D0E0O140*018K7)7+0~7-7/826M8O0~010C0D8`7;666 0U9166938Q0D96987!9a0~7`9k5N7}0v0O2#7R047T9o880~150X9u9w8o7H898w9u6P997V6G8F7^9m7o7}7 6X818C6+0~0n8g86830~9c9K6q9f1 020M0h0Y0#8=8@281N7w7y8k0~7C9V5{5}9}367J6i0A8!1S9C7o8E6|a07m9X7%428L8M3H6h0j8G2Fah8D9Maa9x3f7_9Q7K7M7O7Qab6N9v6/8{agan3|7,0,6H9d9p5$0g3i0t0A0$2y3Ja7az9*aR2z6Y8$a51Tax299u9Zaf8L8}046IaJaz68ae4aaE8j667,0*909(3fa9al5:7a9Paz9R759Uar3Hatb50~2p9Ba;8f9^a_5N8lb17z8qb5a20A0Ta#aUb9ao6`9Nbg049J9!6S7K1S280V8cbv9W04aC6;a,7=apbm6MbbbJ2^7q9T77bU1WbT9E9p0~0G0X0X250rbub$7|bEbr25bIb/8ebL7w4+3+bl7D9 bZ3sa22f2K0A0q2p2r0{0obYb^8A7Sau6i1f2S7La)a?3o9_7Hb(0t0b0-0j0,2zaK6q7bcx3A6264bz0Ia*a@bj6q6h0P1Ga6a~ba6n2%b@3caFbVch0Vcjcc8HbSb4c17pa.aw7P0A9CbM7(bOcpa.bFb?cAba6(c^3=9{ci0Ackazb#c!c;0)btcEcGcnc:b%040Gcrctcvc,d1c$cdc|a.bscDc%8Bc%7}6Ib=bHa)bi6c7z7}2z129-0GcSam9#048531cU730463cNdpbhbNdy9`04cLdodK83cQ0OdF6obDdcde1Kdg9O70cg7L0h7Nc+c-cm0 agdzb;bGd$dL0_czcOdlddcsd+0jcwdid.bca3d6dQaBaDcodb0rc~d0c%d22Fd{dmeddkbK9Dd3dbdtd}dwdS6?a-akc{45d|c@e23|6 020u9.dJcT7z0T0j0~5pes21a=egdab:04dB0tdDd$dH9neVdMbrerev6qdqe,3seGdvbzd80 8idTa`8~a|0H7:bCc;e$e(3O0S5.0A2G2+fb5U1A5W2J2L2H1+1-2J0G1Rfe0S5V10fr0*0,0.04.