Expression bien parenthésée

On considère dans cet exercice un parenthésage avec les couples (), {}, [] et <>. On dira qu'une expression est bien parenthésée si chaque symbole ouvrant correspond à un symbole fermant et si l'expression contenue à l'intérieur est elle-même bien parenthésée.

Bien parenthésées

  • (2 + 4)*7
  • tableau[f(i) - g(i)]
  • #include <stdio.h> int main(){int liste[2] = {4, 2}; return (10*liste[0] + liste[1]);}

Mauvais parenthésage

XKCD 859

  • (une parenthèse laissĂ©e ouverte ; pas de fermante associĂ©e Ă  (.
  • {<(}>) ; mauvaise imbrication.
  • c'est trop tard ;-) ; pas d'ouvrante associĂ©e Ă  ).

Écrire une fonction est_bien_parenthesee qui détermine si une expression passée en paramètre est bien parenthésée avec les couples (), {}, [] et <>. La fonction renvoie un booléen. L'expression sera une chaine de caractères de longueur au plus 1000.

Exemples
>>> est_bien_parenthesee("(2 + 4)*7")
True
>>> est_bien_parenthesee("tableau[f(i) - g(i)]")
True
>>> est_bien_parenthesee("int main(){int liste[2] = {4, 2}; return (10*liste[0] + liste[1]);}")
True
>>> est_bien_parenthesee("(une parenthèse laissée ouverte crée une tension intense qui dure toute la journée.")
False
>>> est_bien_parenthesee("{<(}>)")
False
>>> est_bien_parenthesee("c'est trop tard ;-)")
False

On pourra compléter le code donné qui utilise un dictionnaire ouverture qui renvoie l'élément ouvrant associé à la clé fermante.

Python Console Session
>>> ouverture['}']
'{'
>>> ouverture['>']
'<'
###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
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 : 5/5
.128013;p{nk}7=(32vx[fah1:-tS6zd!m0]Pq)cF.u8_swl,4obiery5g9/ 050z0V0v0q0U0P0N0$0H0P0q0N0N0i010v0U0c010406050N0K0B0B0q0W0X040w0S0P0K0`0S0e050#111315170 0c04051n1g1q0#1n0 0z0U0m0/0;0?0^0;0e0Z0K0q0Z0V0u0c0X0v0r1e0$0r0U0Z0r0P1S0r0v0}050*0T0P0V1z0=0@011R1T1V1T0v1#1%1Z0v0W1o1N0/1a0N0c0q0e0^0l011)1B010p0,0V0e0q0B0V1Z1~20251+281%2b2d0}0a0$0E0W0S0c0S0N0U1d0e0$0(1|0W0W0V0H2y1g2g0e1o0#1N2L1^1`1_1!0z2i1C0U0e2a2v1Z1w1y0:1*2V2X0e0S2#1Z0c2E1o2J2L2=101 2z2%262+0W140P1Z0q1Q2E0p0^030M0M0H2,0V1V2*0S0u0k0u0s0}0$0s1g0q2?2_0~2^2h2{1+2}2 31330V350137393b3d2Y3g0u23040$0l3n3p203r2J2U013w0q301o320r3436383a0(3G2+3I0k3k0k3O2I3q0 3S3u0^3V3X053Z3#3C3%3F2W3H3h0R3k0R3:1h3=3s2`1A3v0S2~3W3y3!3A3$3E3)423+3h0Y3k0Y482=3?2_3T3`4i3~3D3(3c4o3f3h0x3k0x4u4a3@4d3_4f3x3Y3z3B4C413e3I0h3k0h4L3Q4w3t4O3U4Q4h4S4j4U404n4X3h0L3k0L4$2K4(4c2(4+4g3{3}4k3 4m4E4?0u0!3k0!4{3R4x3^504R3|4T4l4D3*4G3i0C0}0s0C5d4}4y4,525k555m4F3I0s3j045E5u4b5w514A544V4=433i3K0s3N0#3o3;4%5J5g4z4.4B4;575Q0s3-5G3/5V3P4|5Z4*5#5j4/5l4W5*455G475/5X2K1r2:1g2#2O0z1`2T5g4D2!1x1o2/0V2;3q611o4D6i2h0U0z0^382J5D3y6p6r565n6u0$2m0V6x5B585F3:4N4 0e0}0S0K0m0W200v6k0$5=4 0S0}0i6T6V260N3K020F0K0S0v0b0j0o0d020P6-6)6+6-6k0 493Q5J6w016s2_3I3K5j705(6z3h236B2c6D716y5C7a1Z606J2|0}0p0V4g0e6S6}2K6U7l1+6X046Z7t3L6#1+6%0}6^6,0b0G0D0g020Z6@6*7I6{6k6 6q7f6t3h5,767V787h3g246C6E5{4p7(2L5W7w3_6M6O7p0v0K2E6!7;017y7A2=7v5f4*0|040d7T7}6L040p88834 850t7|8e7m040S8i4)4 0f7n4f8n4~8k8m7B7D0^850Q8t4y7n8C5g0S0O0}2W8F5?0T0}0y0{8d8o26850j8R8u3v7?6P6R8W3T8A8L6K7n7p147r8$5g850G0g7S8x3S770M7X0u5}7!7+5P7-457c2d905)927j3o6|2@8_7#8{734q6v9e6F5Q4r947e7$584r7/3r8^4x8`8|4I4S8`9k7-4I9n96790u9y6I8j1+8q040(8c7B828S3v0p0}0V0N0v0M0T0U2a0M1 2E7r0r9W0V0V8/840}8V9u9S7=040V0n6g0?0U1e9/8f0}0G8h7B9b6j9d6x8|4Z9z9j7,5o4Z9E7f9Baf993L0$an8y3U0}0c298)267 au1+850o0D8@9c9v9e8|4^ac9F7%4^ah9p5QaH3Oanao7}9M0p8s9Qap8a0Hax0^8H8J1faX899V9{2E9}9 9?8X8z0}a44v8$9w9g599iaJ585aaM7gb0alaRb69Ra=019M0U9P81aY0}a!a*9Ka$8I048Kbi9@aq8l6O6Q8.a;8%a@aCa7aEa9a|5sa~aiae5D5qb2ajbHb5b7bNbf04as1%a0av0}0JbT8Y040q0c0c2a0zbXa?049=aDbpaZb)018;by6~a87WbC6H329AbG3h5E7)7da 5*6H5/bNaSbjba9V1Vbd3qb88D04bhbe7}a%bma)cjc98a7o7q7sb-b98gb?62b^72205D75b|ad915o5Tc195bFcGcCbMc7aRapbbcd3Qcf5!aratbob97 80ceapazaBcZ3TclaWcob.cXbSbv8GbVb:8a2u0cb:8U0Ga#7~0}0Ac$cUbP6N0m7^7`9.c?9:040oc_bgc}0}0Da^4abva{cBb 7ZcEc37-5+cJ9ob35*7Zc6cPc7cR0}2E7_0Wcnc%aT0H0}0I3W0Ndba_dnaFbC8~dscL97cH937*dY9G0s8~dBc8bp9MdG7`dJd5a+bQcYc/c!6Yd47uc(0}aAcx2L6m636h656e1g0v68e82R2M0q1$e50#666|0(0*0,0N04.
Indice 1

On utilisera une pile qui empile les ouvrants, dépile un ouvrant dès qu'un fermant est rencontré en vérifiant la correspondance, et qui ignore les autres caractères.

Indice 2

On pourra compléter le code

Python
def est_bien_parenthesee(expression):
    pile = ...
    for c in ...:
        if c in ...:
            pile.append(...)
        elif c in fermant:
            if ... or ... != ouverture[c]:
                return False
    return pile == ...