Buenos días. Espero que hayas dormido bien ;-)
Me encanta tu pregunta. La verdad es que si no la tienes clara, vas a tener problemas porque es el PPPP (Paradigma del Perfecto Programador en Pascal).
No te voy a resolver el ejercicio pero sí puedo aportar algunas ideas:
- No se dice si hay algún límite en el número de secuencias ni en su longitud.
Para poder definir una estructura de datos que contenga las secuencias sería bueno saber si existen estos límites.
- ¿Puede haber varias secuencias de la misma longitud o todas tienen que ser de longitud diferente? Conviene saberlo porque si puede haberlas se plantea la siguiente cuestión:
- El planteamiento dice que hay que ordenar las secuencias según su longitud. ¿Qué pasa si hay varias secuencias de la misma longitud?
¿Se deben dejar en la pila Resultado en el mismo orden en que estaban en la pila Origen? Es decir, si la secuencia '567' aparece en Origen antes de '358', también aparece antes en la pila Resultado.
¿O bien ordenarlas según la numeración que contienen? Ej '358' va antes de '567' porque 358 < 567 sin tener en cuenta la posición en la secuencia Origen.
¿O es indiferente y pueden ir en cualquier orden en la pila Resultado? (dentro del grupo de las secuencias de su misma longitud).
Con estos dos temas ya tienes información en cuanto a lo de asumir condiciones especiales que no están en el enunciado.
Había pensado proponerte una solución de fuerza bruta, o sea fácil de explicar pero poco eficiente. Pero he cambiado de opinion y voy a por otra solución un poco más "sofisticada". Si es demasiado farragosa, la podemos dejar por si es útil para otra persona.
Lo que te propongo es hacer un barrido de la secuencia de Origen, extraer el indice de inicio y la longitud y después ordenar las secuencias por longitud.
Una vez que estén ordenadas, construir la pila Resultado recuperando los datos de la secuencia en la pila origen en el orden de menor a mayor longitud.
Como en el planteamiento hay referencias a la manera de nombrar funciones y procedimientos, voy a seguir la regla
de nombrar los procedimientos con un verbo indicando la acción que realizan. Y también voy a aplicar un límite al tamaño de la pila de Origen y al número de secuencias.
Si esto no fuera válido, se podría solventar utilizando un array dinámico para contener la pila origen, pero no sé si esto está en vuestro plan de estudios.
Vamos a ir a lo sencillo y utilizar un array normal para contener las secuencias.
Y voy a limitar el tamaño de la pila a 100 elementos.
No está definido cómo va a ser la entrada de datos, o sea la definición de la pila Origen. Es importante asegurarse de que los elementos del array que no estén utilizados por las secuencias, deben ponerse a cero. O se que Origen puede ser algo parecido a:
3 9 1 4 0 3 0 4 6 0 5 7 0 8 0 6 5 4 8 0 2 5 0 0 0 0 0 0 0 ...<muchos ceros> 0 0 0.
En relación con las indicaciones del ejercicio, hay que decir que esta rutina realiza tanto gestión (obtención de la lista de secuencias ListaSec) como cálculo (obtención del número de secuencias NumSec). Se podría dividir en dos rutinas diferentes, pero lo cierto es que aquí surge de un modo tan natural (únicamente requiere la instruccion Inc(NumSec) en la detección de cada secuencia) que soy partidario de dejarla así.
Una vez que se ha obtenido la lista de secuencias, hay que ordenarla. Empleo un algoritmo de ordenación copiado de N.Wirth (Algorithms + Data Structures = Programs) capítulo 2.2.1 Sorting by Straight Exchange, también llamado Bubble Sort pero se puede emplear cualquier otro.
Lo que no me he puesto a averiguar es como deja el programa de ordenación los grupos de secuencias con la misma clave (o sea, con la misma longitud). Este criterio no está definido en el planteamiento del ejercicio. Creo que Bubble Sort respeta el orden inicial. Ya lo he comentado al principio.
Despues de ejecutar este procedimiento tenemos la ListaSec con las secuencias ordenadas de menor a mayor longitud. Ahora a construir la pila Resultado.
Sospecho que ahora estarás el doble de desesperado. Pero si puedo ayudarte con alguna aclaración, aquí estamos.
Ah, he hecho la prueba y (después de algunas correcciones) funciona.
Suerte y no hay que desesperarse.
