In Python moeten alle haakjes gebalanceerd zijn. Dat betekent dat elk geopend haakje verderop in de broncode ook moet afgesloten worden en dat elk haakje dat gesloten wordt, eerder in de broncode reeds moet geopend zijn. Als de haakjes niet gebalanceerd zijn, dan resulteert dit in een compileerfout. Onderstaande illustratie geeft bijvoorbeeld aan welk haakjes met elkaar corresponderen in het gebalanceerde tekstfragment (()(()(()))()(()())).

gebalanceerde haakjes
Voorbeeld dat aangeeft welke haakjes met elkaar corresponderen in de gebalanceerde uitdrukking (()(()(()))()(()())).

Opgave

Beschouw een gegeven uitdrukking waarin de volgende soorten haakjes voorkomen: ronde haakjes ( en ), vierkante haakjes [ en ], accolades { en } en scherpe haakjes < en >. Hierbij hebben we voor elke soort eerst het openend haakje gegeven, gevolgd door het afsluitend haakje. Om te bepalen of de haakjes in de uitdrukking gebalanceerd zijn, kan gebruikgemaakt worden van een stapel. Hierbij worden de symbolen van de uitdrukking van links naar rechts doorlopen. Elk openend haakje dat men hierbij tegenkomt, wordt bovenop de stapel geplaatst. Wanneer men een afsluitend haakje tegenkomt, dan wordt het bovenste haakje van de stapel gehaald en vergeleken met het afsluitende haakje om te zien of beide van dezelfde soort zijn. Indien dat niet het geval is, dan zijn de haakjes niet gebalanceerd. Anders wordt de uitdrukking verder verwerkt. Als de volledige uitdrukking verwerkt is, dan zijn de haakjes enkel gebalanceerd als de stapel leeg is. Anders is de uitdrukking niet gebalanceerd.

gestapelde haakjes
Voorbeeld dat aangeeft hoe een stapel kan gebruikt worden om na te gaan dat de haakjes in het tekstfragment {[()]} gebalanceerd zijn.

Schrijf een functie gebalanceerd waaraan een uitdrukking als stringargument moet doorgegeven worden. De functie moet een Booleaanse waarde teruggeven, die aangeeft of de haakjes in de gegeven uitdrukking al dan niet gebalanceerd zijn.

Voorbeeld

>>> gebalanceerd('{[()]}')
True
>>> gebalanceerd('{[(]}')
False
>>> gebalanceerd('{[()}')
False
>>> gebalanceerd('{[()]')
False