Marchez de gauche à droite en utilisant une pile pour garder une trace de la couleur sur laquelle vous vous trouvez. Au lieu d'une carte discrète, utilisez les 10 nombres de votre jeu de données comme points d'arrêt.
En commençant avec une pile vide et en mettant start
à 0, bouclez jusqu'à ce que nous atteignions la fin:
- Si la pile est vide:
- Recherchez la première couleur à partir de ou après
start
, et poussez-la et toutes les couleurs de rang inférieur sur la pile. Dans votre liste aplatie, marquez le début de cette couleur.
- sinon (si non vide):
- Trouvez le point de début suivant pour toute couleur de rang supérieur à ou après
start
, et trouvez la fin de la couleur actuelle
- Si la couleur suivante commence en premier, poussez-la et toute autre chose sur le chemin vers la pile. Mettez à jour la fin de la couleur actuelle comme début de celle-ci et ajoutez le début de cette couleur à la liste aplatie.
- S'il n'y en a pas et que la couleur actuelle se termine en premier, définissez-la
start
à la fin de cette couleur, retirez-la de la pile et vérifiez la couleur classée la plus élevée suivante.
- Si se
start
trouve dans la plage de couleurs suivante, ajoutez cette couleur à la liste aplatie, en commençant par start
.
- Si la pile se vide, continuez simplement la boucle (revenez au premier point).
Ceci est un passage mental étant donné vos données d'exemple:
# Initial data.
flattened = []
stack = []
start = 0
# Stack is empty. Look for the next starting point at 0 or later: "b", 0 - Push it and all lower levels onto stack
flattened = [ (b, 0, ?) ]
stack = [ r, b ]
start = 0
# End of "b" is 5.4, next higher-colored start is "g" at 2 - Delimit and continue
flattened = [ (b, 0, 2), (g, 2, ?) ]
stack = [ r, b, g ]
start = 2
# End of "g" is 12, next higher-colored start is "y" at 3.5 - Delimit and continue
flattened = [ (b, 0, 2), (g, 2, 3.5), (y, 3.5, ?) ]
stack = [ r, b, g, y ]
start = 3.5
# End of "y" is 6.7, next higher-colored start is "o" at 6.7 - Delimit and continue
flattened = [ (b, 0, 2), (g, 2, 3.5), (y, 3.5, 6.7), (o, 6.7, ?) ]
stack = [ r, b, g, y, o ]
start = 6.7
# End of "o" is 10, and there is nothing starting at 12 or later in a higher color. Next off stack, "y", has already ended. Next off stack, "g", has not ended. Delimit and continue.
flattened = [ (b, 0, 2), (g, 2, 3.5), (y, 3.5, 6.7), (o, 6.7, 10), (g, 10, ?) ]
stack = [ r, b, g ]
start = 10
# End of "g" is 12, there is nothing starting at 12 or later in a higher color. Next off stack, "b", is out of range (already ended). Next off stack, "r", is out of range (not started). Mark end of current color:
flattened = [ (b, 0, 2), (g, 2, 3.5), (y, 3.5, 6.7), (o, 6.7, 10), (g, 10, 12) ]
stack = []
start = 12
# Stack is empty. Look for the next starting point at 12 or later: "r", 12.5 - Push onto stack
flattened = [ (b, 0, 2), (g, 2, 3.5), (y, 3.5, 6.7), (o, 6.7, 10), (g, 10, 12), (r, 12.5, ?) ]
stack = [ r ]
start = 12
# End of "r" is 13.8, and there is nothing starting at 12 or higher in a higher color. Mark end and pop off stack.
flattened = [ (b, 0, 2), (g, 2, 3.5), (y, 3.5, 6.7), (o, 6.7, 10), (g, 10, 12), (r, 12.5, 13.8) ]
stack = []
start = 13.8
# Stack is empty and nothing is past 13.8 - We're done.