Ejercicio 1) (3 puntos). Dado el TAD Pila de Números Enteros con las siguientes operaciones: boolean pilavacia (); void apilar (int x); int desapilar () throws PilaVacia; SE PIDE: Codificar un método estático entero en Java que, recibiendo como parámetro una pila perteneciente al TAD anterior, devuelva como resultado: -1. Si el elemento del fondo de la pila es menor que el número de elementos de la misma. 0. Si el elemento del fondo de la pila es igual que el número de elementos de la misma. +1. Si el elemento del fondo de la pila es mayor que el número de elementos de la misma. EJEMPLO: Dada la pila mostrada en la figura, el método deberá devolver el valor 0 dado que dicha pila contiene 9 elementos, cantidad que coincide con el valor del fondo de ella. OBSERVACIONES: En caso de que la pila se encuentre vacía el método devolverá el valor 0. La pila puede contener elementos repetidos. Además de la pila, la cabecera del método podrá incluir otros argumentos. 9 7 2 8 2 3 2 9 9 NORMAS DE OBLIGADO CUMPLIMIENTO (su no observación supondría la calificación de 0 puntos): Queda expresamente prohibida la utilización de operaciones no definidas en el TAD. No se permite utilizar ninguna estructura de datos auxiliar. Cada elemento de la pila solamente podrá ser, a lo sumo, desapilado y apilado una vez. Al finalizar el proceso la pila deberá quedar con el contenido y estructura iniciales. Responder sobre esta misma hoja. No se permitirá la entrega de hojas adicionales.
Solución: public static int comprobarfondo (Pila p, int contador) throws PilaVacia { int elem, dato; if (!p.pilavacia ()) { elem = p.desapilar(); contador++; if (!p.pilavacia ()) dato = comprobarfondo (p, contador); else if (contador == elem) dato = 0; else if (contador < elem) dato = 1; else dato = -1; p.apilar (elem); else dato = 0; return dato;
Ejercicio 2) (3 puntos). Dada la siguiente declaración de lista calificada no ordenada de números naturales: public class Lista { class NodoLista { int dato; NodoLista sig; NodoLista inicio; SE PIDE: Codificar un método entero en Java que, recibiendo una lista perteneciente al tipo anterior y dos valores enteros: x y d, devuelva la clave que se encuentra a la distancia d del nodo que contiene la clave x. EJEMPLO: Dada la lista de la figura, con x = 6 y d = 2, el método deberá devolver el valor 5, que es la clave que se encuentra a una distancia (d) de dos posiciones del nodo que contiene la clave (x) 6. 3 4 1 6 9 5 OBSERVACIONES: Si la clave x no se encuentra en la lista, el método devolverá el valor 0. Igualmente, si no existe el elemento d posiciones después de la clave x, se sustituirá su valor por 0. Dado que se trata de una lista calificada, no existen claves repetidas. Se supone que d es mayor que cero. NORMAS DE OBLIGADO CUMPLIMIENTO (su no observación supondría la calificación de 0 puntos): No se permite utilizar ninguna estructura de datos auxiliar. Solo se permitirá la realización de un único recorrido en la lista. Al finalizar el proceso la lista deberá quedar con el contenido y estructura iniciales. Responder sobre esta misma hoja. No se permitirá la entrega de hojas adicionales.
Solución: B. Solución recursiva: static int elementod (NodoLista lista, int d) { int resul = 0; if (lista!= null) { if (d == 1) resul = lista.clave; else resul = elementod (lista.sig, d-1); static int devolverelementoposiciond (NodoLista lista, int x, int d) { int resul; if (lista!= null) { if (lista.clave == x) resul = elementod (lista.sig, d); else resul = devolverelementoposiciond (lista.sig, x, d); else resul = 0; static int llamadasumarelementosposiciond (Lista lista, int x, int d) { return devolverelementoposiciond (lista.inicio, x, d); C. Solución iterativa: static int devolverelementoposicionditerativo (Lista lista, int x, int d) { int resul = 0, i = 0; NodoLista aux = lista.inicio; if (aux!= null) { boolean encontrado = false; while (aux!= null &&!encontrado) { encontrado = aux.clave == x; if (!encontrado) aux = aux.sig; if (encontrado) { while (i < d && aux!= null) { aux = aux.sig; i++; if (i == d) resul = aux.clave;
Ejercicio 3) (3 puntos). Dada la siguiente declaración de árbol binario de números enteros: public class Arbol { class NodoArbol { int clave; NodoArbol iz; NodoArbol de; NodoArbol raiz; SE PIDE: Implementar un método booleano en Java que, recibiendo como argumento un árbol perteneciente al tipo anterior, devuelva el valor true si el valor de la clave contenida en el nodo raíz coincide con el número de hojas y false en caso contrario. EJEMPLO: Dado el árbol de la figura, el método solicitado devolverá el resultado false dado que la clave contenida en el nodo raíz (10) no coincide con el número de hojas (4). OBSERVACIONES: Si se recibe un árbol vacío, la función devolverá el valor true. 10 20 30 40 50 60 70 NORMAS DE OBLIGADO CUMPLIMIENTO (su no observación supondría la calificación de 0 puntos): No se permite la utilización de ninguna estructura de datos auxiliar. Sólo se permite la realización de un único recorrido del árbol. Al final de la ejecución de la función, el árbol deberá permanecer con la estructura y el contenido iniciales Responder sobre esta misma hoja. No se permitirá la entrega de hojas adicionales.
Solución: static int contarhojas (NodoArbol arbol) { int resul = 0; if (arbol!= null) if (arbol.iz == null && arbol.de ==null) resul = 1; else resul = contarhojas(arbol.iz)+contarhojas(arbol.de); static boolean comprobarnumerohojas (Arbol arbol) { boolean resul = true; if (arbol.raiz!= null) resul = (arbol.raiz.clave == contarhojas(arbol.raiz));
Ejercicio 4) (1 punto). Dada la siguiente declaración de la clase Grafo dirigido, no etiquetado ni ponderado: public class Grafo { int maxnodos; int numvertices; boolean matrizady [ ] [ ]; boolean dirigido = false; SE PIDE: Implementar un método estático booleano en Java que, recibiendo como argumento un grafo perteneciente a la clase anterior, devuelva el valor true si existe algún bucle en el grafo, y false en caso contrario. EJEMPLO: Dado el grafo de la figura, el método solicitado devolverá el valor true dado que existe un bucle (correspondiente al vértice de índice 4) en el mismo. 0 1 2 3 4 NORMAS DE OBLIGADO CUMPLIMIENTO (su no observación supondría la calificación de 0 puntos): Responder sobre esta misma hoja. No se permitirá la entrega de hojas adicionales.
Solución: public static boolean comprobarsibucle (Grafo g) { boolean resul = false; int i; for (i = 0; i < 5; i++) if (g.matrizady [i] [i]) resul = true;