3 de abril de 2017

Ejercicios selectos (pilas).

  1. En el Ejemplo PilaPrimitiva el método imprime tiene las líneas 50 y 52 como comentarios ¿Qué sucede si sustituye la línea 51 por la línea 50 y la línea 53 por la línea 52? ¿Compilará? ¿Si sí por qué, y si no por qué? Si compila ¿Cuál será el resultado de la ejecución? Determine sus respuestas y después corrobore las mismas con la experimentación.
  2.  Con base en el Ejemplo PilaPrimitiva, haga una implementación completa de una pila que almacene char primitivos y pruébela Cuando termine, considere lo siguiente:
    1. ¿Puede visualizar las implicaciones de este ejercicio?
    2. ¿Qué pasa por ejemplo si ahora se necesita almacenar datos de tipo double?
  3. En el Ejemplo PruebaPila se creó una pila utilizando un constructor sin argumentos. Modifique dicho ejemplo para asignar un nuevo nombre a la pila por medio del constructor correspondiente; asígnele a la pila el nombre de "Mi primera pila", recompile y pruebe su funcionamiento.
  4. Modifique el Ejemplo PruebaPila para que permita leer n números enteros desde la entrada estándar y los almacene en la Pila.
  5. En el blog, durante la explicación del Ejemplo PruebaPila, se menciona la cláusula try-catch-finally; sin embargo, en dicho ejemplo sólo se muestra el uso de la cláusula try-catch. Investigue y documéntese acerca del uso y funcionamiento de la cláusula completa try-catch-finally. También investigue más acerca del uso y manejo de excepciones, así como la documentación del API respecto al método printStackTrace.
  6. Modifique el Ejemplo Pila para que:
    1. Agregue el método peek a la implementación. Recuerde que dicha operación hecha un vistazo al elemento que se encuentra en el tope de la pila y lo regresa, pero no lo elimina.
    2. Incorpore un atributo privado numérico (n) que lleve el control del número de elementos insertados en la pila. Al respecto no olvide:
      1. Inicializar explícitamente dicho atributo a cero en el constructor.
      2. Proporcionar únicamente el método de tipo get para el atributo n: size( ).
  7. Tomando como referencia el Ejemplo PruebaPilaGenerica, modifíquelo para que la pila genérica del Ejemplo Pila almacene otro tipo de objetos además de los de la clase Integer. Pruebe con al menos las siguientes clases:
    1. Double.
    2. String.
    3. Persona (del Ejemplo Persona).
    4. Cientifico (del Ejemplo Cientifico).
  8. Utilice una pila para verificar si, dada una expresión, ésta es o no un palíndromo. Un palíndromo es una frase o expresión que se lee o interpreta igual procesándola de izquierda a derecha, que de derecha a izquierda. Algunos ejemplos de palíndromos son (Nota: Simplifique el problema y no considere acentos ni la letra ñ en su implementación):
    1. 1991.
    2. 2002.
    3. Hannah.
    4. Reconocer.
    5. Se van sus naves.
    6. Ateo por Arabia iba raro poeta.
    7. Dábale arroz a la zorra el abad.
    8. Anita lava la tina.
    9. La ruta nos aportó otro paso natural.
    10. Las Nemocón no comen sal.
    11. No di mi decoro, cedí mi don.
    12. A la catalana banal, atácala.
  9. Realice la implementación del Algoritmo de verificación de balanceo presentado en la entrada Algunas aplicaciones de las pilas. Para lo anterior, construya una clase cuyo nombre sea Expresion, e implemente dicho algoritmo como uno de los servicios o acciones de la clase, identifique al método como verificaBalance de tal forma que su firma sea: public boolean verificaBalance( );.
    1. No olvide realizar las pruebas correspondientes para validar y verificar la funcionalidad de su propuesta.
    2. Sugerencia: implemente la verificación de equivalencia de símbolos como un método privado; es decir, un método que proporcione servicio a otros métodos de la misma clase (servicio interno), pero no a los objetos instanciados (servicios públicos).
  10. Convierta paso a paso utilizando papel y lápiz, las siguientes expresiones en su representación en interfija a su correspondiente notación postfija. Nota: el símbolo @ representa la potencia y es el de mayor precedencia. Note que se han proporcionado las soluciones correspondientes:
    1. A + B.
      1. A B +.
    2. A + B - C.
      1. A B + C -.
    3. (A + B) * (C - D).
      1. A B + C D - *.
    4. A @ B * C – D + E / F / (G + H).
      1. A B @ C * D - E F / G H + / +.
    5. ((A + B) * C – (D - E)) @ ( F + G).
      1. A B + C * D E - - F G + @.
    6. A – B / (C * D @ E).
      1. A B C D E @ * / -.
  11. Continuando con la idea planteada en el ejercicio anterior, convierta paso a paso las expresiones pero ahora a su representación en notación prefija. Se proporcionan a continuación las soluciones correspondientes:
    1. + A B.
    2. - + A B C.
    3. * + A B - C D.
    4. + - * @ A B C D / / E F + G H.
    5. @ - * + A B C - D E + F G.
    6. - A / B * C @ D E.
  12. Diseñe un algoritmo, así como su correspondiente implementación, para convertir una expresión en notación interfija a su correspondiente notación postfija y prefija respectivamente. Agregue los métodos siguientes a la clase Expresion iniciada en el Ejercicio 9. Asegúrese de probar sus implementaciones con al menos, los dos ejercicios anteriores:
    1. Postfija (firma del método public String obtenPostfija( )).
    2. Prefija (método public String obtenPrefija( )).
  13. Realice la implementación del Algoritmo de evaluación de una expresión en notación postfija presentado en la entrada Algunas aplicaciones de las pilas. Implemente dicho algoritmo como uno de los servicios de la clase Expresion iniciada en el Ejercicio 9. Proponga una firma de método ad hoc a la responsabilidad de éste pero utilice el identificador evaluaPostfija.
    1. No olvide realizar las pruebas correspondientes para validar y verificar la funcionalidad de su propuesta.
    2. Sugerencia: implemente la realización de la operación representada por símbolo como un método privado; es decir, un método que proporcione servicio a otros métodos de la misma clase (servicio interno), pero no a los objetos instanciados (servicios públicos).
  14. Repita el Ejercicio 9 con la clase Stack del API de Java:
    1. Desde el punto de vista de la ejecución, ¿nota alguna diferencia?
    2. ¿Tendría alguna ventaja o desventaja utilizar el API?
    3. Si la clase Pila del Ejemplo Pila fuera parte del API de Java, ¿cuál utilizaría y por qué?