Generics PDF
Generics PDF
1. Defina e implemente la clase Pila para enteros. Fíjese en la transparencia de clase. Haga
una primera versión con un tamaño máximo fijo que se pasa al constructor (array) y sin
comprobar errores. Luego compruebe errores y lance una excepción en caso de violación
(sacar de una pila vacía o meter en una pila llena).
2. Defina a partir de la Pila anterior una Pila sin restricciones de tamaño. Emplee una lista de
Elementos para que pueda crecer indefinidamente, con referencias al siguiente y al previo
en la lista. Hágala de modo que si se suprimen elementos de la pila no se pierda la
memoria, guárdela por si luego se añaden más elementos no haya que pedir memoria.
3. Defina a partir de la Pila anterior una Pila genérica, que pueda contener cualquier tipo de
Objeto, es decir, que pueda emplearse luego como una pila de Strings o como una pila de
Coches.
4. Defina a partir de la Pila anterior una Pila que valga para todos los Números (Numbers).
5. Use la clase Pila genérica para invertir una palabra. A partir de este programa determinar si
una palabra es palíndromo (se lee igual de izquierda a derecha que de derecha a izquierda:
reconocer, rotor, somos,..)
7. Defina e implemente una función ordenar que ordene enteros de mayor a menor. Recibirá
un array con los enteros a ordenar.
8. Defina a partir de la función ordenar anterior una genérica que permita ordenar objetos.
Recibirá un array con los objetos a ordenar. Suponga que los objetos tienen un método
compareTo(obj o) que permite comparar el objeto en curso (this) con el objeto recibido,
que devuelve -1 si es menor que el recibido, 0 si son iguales y 1 si es mayor que el
recibido. Use esta función con el array de enteros anterior. Apóyese en una función
intercambiar que reciba un array de objetos y dos enteros, que marcan las posiciones de los
elementos a intercambiar.
9. Defina una clase Empleado, con nombre, apellidos, fecha de contratación y número de
empleado y use la función anterior para ordenar un array de Empleados. Use la antigüedad
como criterio a seguir (es “mayor” si es más antiguo). Si entraron en el mismo día, utilice
el número de empleado para desempatar
10. Defina una clase que representa una entrada de una agenda, con el nombre, primer apellido,
segundo apellido, teléfono, e-mail y móvil. Use la función anterior para ordenar un array de
entradas de agenda, usando como criterio de ordenación los apellidos y luego el nombre.
11. Defina e implemente un directorio de teléfonos. En el mismo tendrá entradas de agenda con
los campos anteriores. Se buscará por el nombre y apellidos y devolverá la entrada de
agenda correspondiente. Estos esquemas, para no recorrer toda la información, que puede
tener miles de entradas, se apoyan en tablas Hash, que tienen dos partes, una clave que nos
permite buscar la información (nombre y apellidos) y una información a recuperar asociada
a esa clave.
Pruebe a insertar unas pocas entradas y luego a buscar alguna de ellas. Pruebe a insertar
dos nombre iguales, que cambie simplemente en el orden de los apellidos, para asegurar
que irán a la misma posición.
12. Use otra tabla Hash para contar palabras iguales. Deberá buscar cada palabra y si ya está
incrementar el contador asociado. Si no está deberá insertarla con el contador a 1.
13. Defina una función barajar que reordena aleatoriamente los elementos de un array. Recibe
un array y un objeto de tipo Random que genera números aleatorios. Recorre el array, en
orden decreciente, e intercambia la posición actual con una aleatoriamente elegida que va
desde la primera posición del array a la actual. Puede emplear la función intercambiar
anterior. Para obtener una posición aleatoria llamar al método “int nextInt(int i)” que
devuelve un entero entre 0 y i-1.
14. Construir un array de Strings que represente una baraja americana, con 4 palos (corazones,
picas, diamantes y tréboles) y 12 cartas cada uno (as, 2, 3,…10, paje, reina, rey). Construir
el array con dos bucles anidados. Construir una función repartir que dada una baraja
devuelva una mano de “n” cartas, empezando por el final del array (¡la baraja está boca
abajo!) y que suprime las cartas de la baraja (del array), para evitar poder dar dos veces la
misma carta. Esta función recibe tres argumentos, un array de cartas, la baraja, otro array
de cartas, la mano a construir, y un entero “n” con el número de cartas a dar a esa mano.
Emplee esta función para repartir “n” cartas a “m” jugadores, recibiendo tanto n como m a
través de los argumentos del programa. Previamente debe barajar las cartas, para
asegurarse que nadie sabe que carta se repartirán a cada uno.
15. Construya una calculadora basada en la notación polaca inversa. Esta notación indica
primero los argumentos y luego el operador a aplicar. Es decir, 6+7 se ve como 6 7 +. Un
ejemplo con una expresión más compleja sería: (6+2)*5-8/4 que sería 6 2 + 5 * 8 4 / -. En
un primer paso deberá transforma la expresión a notación polaca inversa. El algoritmo, que
se apoya en el uso de una pila, se muestra a continuación:
La precedencia de los operadores es: ^ tiene mayor precedencia que los demás, *, /, y %
tienen la misma entre si y tienen mayor precedencia (deben evaluarse antes) que + y -, que
tienen entre si la misma. A misma precedencia se opera de izquierda a derecha.
Entrada: 3 + 4 * 2 / ( 1 - 5 ) ^ 2 ^ 3
Stack de
Token Acción Salida Notas
operadores
3 agrega token a la salida 3
+ Push token al stack 3 +
4 agrega token a la salida 34 +
* Push token al stack 34 * + * tiene mayor precedencia que +
2 agrega token a la salida 342 *+
Pop stack a la salida 342* + / y * tienen la misma precedencia
/
Push token al stack 342* / + / tiene mayor precedencia que +
( Push token al stack 342* (/+
1 agrega token a la salida 342*1 (/+
- Push token al stack 342*1 -(/+
5 agrega token a la salida 342*15 -(/+
Pop stack a la salida 342*15- ( / + Repite hasta que sea encontrado "("
)
Pop stack 342*15- / + Descarta paréntesis emparejados
^ Push token al stack 342*15- ^ / + ^ tiene mayor precedencia que /
2 agrega token a la salida 342*15-2 ^/+
^ Push token al stack 342*15-2 ^ ^ / + ^ es evaluado de derecha a izquierda
3 agrega token a la salida 342*15-23 ^^/+
end Pop todo el stack a la salida 3 4 2 * 1 5 - 2 3 ^ ^ / +
5 Introducir en la pila 5
1 Introducir en la pila 5, 1
2 Introducir en la pila 5, 1, 2
4 Introducir en la pila 5, 3, 4