Aller au contenu

Pile persistante⚓︎

On veut écrire une classe pour gérer une pile à l'aide d'une liste chainée. On dispose d'une classe Maillon permettant la création d'un maillon de la chaine, celui-ci étant constitué d'une donnée valeur et d'une référence au maillon suivant de la chaine:

🐍 Script Python
class Maillon:
    def __init__(self, valeur, suivant):
        self.valeur = valeur
        self.suivant = suivant

Une pile non vide est représentée par des maillons avec un maillon de tête, le dernier ajouté à la pile avec la méthode empile et celui qu'on va enlever de la pile avec la méthode depile.

Le maillon de tête contient l'élément au sommet de la pile. Ci-dessous la représentation d'une pile dans laquelle on a empilé 9, puis 2, puis 8, puis 5:

représentation d'une pile

Afin d'obtenir une structure persistante les méthodes empile et depile créent et renvoient une nouvelle pile sans modifier la pile initiale. Ceci peut permettre de garder une trace des états successifs de la pile.

Principe de fonctionnement de la méthode depile qui prend en paramètre une pile 1 et renvoie une pile 2:

représentation de la fonction depile

Attention, la méthode depile ne renvoie pas l'élément dépilé.

Principe de fonctionnement de la méthode empile qui prend en paramètre une pile 1 et un élément, (ici le nombre 7), et renvoie une pile 2:

représentation de la méthode empile

On complète la classe Pile avec une méthode sommet qui permet de récupérer si c'est nécessaire le sommet d'une pile avant un dépilement.

Compléter la classe Pile et vérifier votre travail sur les exemples. On vous donne la méthode __init__ qui initialise une pile, la méthode __str__ qui permet un affichage des éléments de la pile (avec la fonction print), la méthode est_vide qui renvoie True si la pile est vide et False sinon.

Exemples
>>> p = Pile()  # une pile vide
>>> p.est_vide()
True
>>> p = p.empile(9)
>>> p.est_vide()
False
>>> p1 = p.empile(5)
>>> p2 = p1.empile(8)
>>> print(p1)
5 -> 9
>>> print(p2)
8 -> 5 -> 9
>>> p2.sommet()
8
>>> p3 = p2.depile()
>>> print(p3)
5 -> 9
>>> print(p2)
8 -> 5 -> 9
>>> print(p2.depile())
5 -> 9
###(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
.128013beqn,4é9vi+à3mo5_tLR;PhkMlpwNf(: cg.a=ry0S6-u/72)s18d050#0c0s0L0k0A0Y0H0I0A0L0Y0Y0M010s0k0B010406050Y0T0o0o0L0N0O040Q0p0A0T0_0p0e0H020L0o0B0v0H0u0c130N0d0T0c0Y050U101214160~0B04051B1u1E0U1B0~0#0k0j0.0:0=0@0x0k0J0x0A1S0x0s0|050)0b0A0c1N0;0?011R1T1V1T0s1#1%1Z0s0N1C0s0x0.190Y0B0L0e0@0W011)1P010E0+0c0e1h0c1Z1 21261+291%2c0o2e040a0H0w0N0p0B0p0Y0k1c1e0%1}0N0N0c0I2z1u2g0e1C0U1{2L1^1`1_1!0#2i0@1V0e2b2w1Z1K1M0/1*2V0k2X0e0p2#1Z0B2E1C2J2L2?0 201e2%272,0N130A0|0H0Z2I2`0}2_2h2|1+2~30320W3521372J2U013c0L31040H0n3g2K0~3j3a0@3m3o0H0g3s3i2`3k3y320q3C3u3E3w3l0p2 3n320R3J382{1O3b3O3d3p0V3T3v3W3x3Y3Q3p0!3$3L3(3N3P3z0i3.393:3G040Z0P3^3V2(3;3Z0Z341v363K3_413{0Z3f463h48402}3*3o0Z3r4e3t3U3F4j0|0Z3B4n3D494i3=4s3I4v4g4q4z3|3S4C4p3M4b3#4I3%4a4r3|3-4N3/4P4F0Z3@4T4x3X4F0W3~4Z4h4#3Z0W452?4D4K4Q0W4d4/4J3`4=4m4^4O4y4,4u4}4U4 3+0W4B524!3)4$4H584*5a4,4M5d4E4,4S5i4;4$4Y5m4`4F0n4(2^1H2;1u2#2O0#1`2T3M0I2-2o0$1L1C2:0c2=363C055F0%5N59010y0|3a5P4~1+0C325Z533b0I0|0z0*0A0A1d5(5U0{040G3J0H5{0H4_415W040%0E5=5e015$3p643k0E0o0|0r0r2*2y6e693M5@0F6j3:0b5@0Y0c0A634v5~275@0f3C5}5!3x0|0j3n0c0T0N6n416y6A6w3b0|101L210s6K6x0|0X5_4C5|6#6B5)0@6p6Q6s6u2^6C010p0|0K6V6P046F1%6I6N6/6;040M6}6(3l6E6G6|6!6$5{6O6)6q6,6@0@6 6?6v6/0e6Q0T6S0e6U4v6%5U6 717r7b74046R6F7p3J066#7x60627f665%7j736b6d0r0Y1^6i7M5?0|6m7U656*7z7e7Y3k5@6Y5`797s65600k6-367-3k7!6r6t7J7h7J7l7z7n7B7q2?7?3M0p670k1t7w6/0y5+040D1d0c7J5@6Z4/7,6$7G0|2E0s6I0e725U0e0b6Q1^8i7W7J7^7$6.737|7%4K756{6J8I3:7)7+798o048q8s8u658w8y8M8F7V047X8#7Z7d7`8N418H8)3F8K6H8!5O6/8P8a8G0|0l8W3k0Y0Z0|02030n0i1k0S020J0s1k94960v8 858}9h3`8x7z8z8-6W8%8C8+7;3h7x8/8^737~7A6T8A040X7D8S5Y9p5#7L8:4K8d0w2a9D8k477F8b0|7I9J0@675}9Y286c046e6g0s7T9M8O8B9$8D8,9.6L0|6z8{8v0|130+5:8t9$7u7J8c0|8f2X9D7*788R6/9=9u2K9w6=7}9}5.a09k8.0|7v837x7~9~5/5;7r843:0I9204030Ha71(2x0H0:0H0B2a0H1s0s0H0j0k0%7D9U737H0caf5T659!7}0E0|aO0raRaT9$6l9s6+9?9y8$aa8l7,8S8U0Na1arad9t7{ai9$atalawa 8G8789b85Ua58e8gaU5|8S9X9@27a$b4a(041naL1%9D8(a?8*a;aZ7x6M9{8Xa)0A82bw7(6X9S4f8ma{0(8VbC8;049Pbta.9:bl6^5-9 b7bH6kbWb$3`bEbG9v8_9_an27aeb2047ibX6D04auambV9E9F4C7Ebi9V61aY7Jbnb_3lbp0Y0p120(bua:7#a=b-737)bK3tbMc47:b:1+860|2,b,2Kay41b=a2b3c97~a*a,8hb~0Fa^9T8mc3aW8pbOa}cs7cbyb?b^b)4aakb!a~cY279xck9|6_768@4fc27ac4bkc%9K68bo9W0cbscIc9a/9;b1b~cLbLa`cqaZczc(67cwcT01cBc9c)ag7ka)7Ra+aSc~c@0@6ld4cocNc;cP8TcRc$3hd96^bTdoc*65d0c9dfdp6:cDdKb5c#cWaj7 7ocxa!bI9Ebhdvbdc{bz6/c8dK7O9)7Q7S0rcgd1cVd3cn0}cpdwa|dzcyas9m7Rc.diclb(dF7@d2dgdMe48Jb{b6d{dVb%dX4I0U5R5M1F5x0U5z1u0s5Bep2R2M0L1$eken5J1Aee3:2E0o0r0E0L0y0c0r0x0n0|1m1o1q1s0Hd?1F371B0teRc}0-0B0c0N2x7R6TeRcc7p0H1b0+880heY140.e$0)2*0-3n0J3O2y0x2n0-0#1daP0A00aY290I0L0I2y0haN7RaI0ke=0H0maI0L1}0e2c880Y210I1(2Bf71R7Re eQ0H0%f37:0E0h2E7p0-0h0)0sf3000T2XaK2a7i1I5y0(5.0Y04.