2017-08-23 2 views
0

J'ai récemment essayé de résoudre un problème sur Hackerrank qui nous demandait de déterminer si une chaîne contenant des crochets (par exemple {},() et []) était équilibrée ou non (source: https://www.hackerrank.com/challenges/balanced-brackets). Je voulais résoudre cela en utilisant l'approche suivante qui a également intégré le format initial HackerRank fourni:Comment comprendre ce code en termes de construction et d'évaluation d'une pile?

import sys 

def isBalanced(s): 
    #insert code here 

if __name__ == "__main__": 
    t = int(raw_input().strip()) 
    for a0 in xrange(t): 
     s = raw_input().strip() 
     result = isBalanced(s) 
     print result 

Je tiens également à noter que le site a configuré les éléments suivants comme étant l'entrée standard afin de tester la fonctionnalité du code:

3 
{[()]} 
{[(])} 
{{[[(())]]}} 

afin d'obtenir la sortie suivante:

YES 
NO 
YES 

Cependant, je ne comprenais pas comment aborder ce code, principalement parce que Je ne comprenais pas pourquoi Hackerrank utilisait la clause if __name__ == "__main__":, car je pensais que cette clause n'était utilisée que si quelqu'un voulait que son module soit exécuté directement plutôt qu'exécuté en étant importé dans un autre script (source: What does if __name__ == "__main__": do?). Je n'ai pas non plus compris la boucle for contenant for a0 in xrange(t): puisque a0 n'est pas utilisé dans la boucle for pour quoi que ce soit, donc je ne sais pas vraiment comment l'entrée standard serait traitée.

donc j'ai fini regardant la solution sur la page de discussion, et ici il est ci-dessous:

lefts = '{[(' 
rights = '}])' 
closes = { a:b for a,b in zip(rights,lefts)} 

def valid(s): 
    stack = [] 
    for c in s: 
     if c in lefts: 
      stack.append(c) 
     elif c in rights: 
      if not stack or stack.pop() != closes[c]: 
       return False 
    return not stack # stack must be empty at the end 

t = int(raw_input().strip()) 
for a0 in xrange(t):  
    s = raw_input().strip()  
    if valid(s): 
     print 'YES' 
    else: 
     print 'NO' 

Ce code me confond aussi, comme l'auteur prétendait utiliser une structure de données appelée « pile "(bien que cela semble être juste une liste de Python pour moi). Et bien que l'auteur a supprimé l'instruction if __name__ == "__main__":, ils ont conservé le for a0 in xrange(t):, dont je ne suis pas sûr comment il traite l'entier de l'entrée standard et les chaînes correspondantes.

En outre, bien que la fonction isBalanced me perturbe car elle renvoie not stack. Dans un commentaire de hachage sur l'instruction return de la fonction, l'auteur indique également le # stack must be empty at the end. Qu'est-ce que ça veut dire? Et comment cette liste peut-elle être vide si, au cours de la clause if c in lefts:, la pile est ajoutée avec le caractère de la chaîne qui est itérée dans la boucle for. Alors pourquoi la fonction retournerait not stack? Ne serait-il pas cohérent avec return True pour que la fonction agisse comme un testeur booléen (c'est-à-dire reviendrait vrai si un certain objet adhérait à certains critères, et faux si l'objet ne le faisait pas)? Je ne suis pas encore familiarisé avec le codage. Il y a donc beaucoup de principes que je ne connais pas. Quelqu'un peut-il éclairer sur la façon dont cela fonctionnerait?

Répondre

0

iam ne sais pas comment fonctionne votre code .. si nom == "principal": faire)?. juste exlained où vous utilisez Avant d'exécuter le code, il va définir quelques variables spéciales. Par exemple, si l'interpréteur python exécute ce module (le fichier source) en tant que programme principal, il définit la variable name comme ayant la valeur "main". Si ce fichier est importé d'un autre module, nom sera défini sur le nom du module