Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Se deja como ejercicio la modificación del método anterior para que, además, las
pilas a y b conserven su valor al finalizar.
b) (1 Punto) Programe un método
void concatStack(StackIF<E> b)
dentro de la clase Stack, que modifique la pila llamante al concatenarle la pila
resultado. Deberá, para ello, usarse la estructura interna de las pilas.
Seguiremos la misma estrategia que en el apartado anterior, pero al revés: ahora
copiaremos el contenido de b en la pila llamante. Como, además, estamos dentro
de la clase Stack, podemos (y debemos, según el enunciado) utilizar la estructura
interna de las pilas: la secuencia de nodos en la que almacenamos los valores.
Para ser estrictos, dado que se nos pide que b sea un objeto de una clase que
implemente el interfaz StackIF<E>, la solución pasa por localizar el último
nodo de la secuencia donde almacenamos los valores de la pila llamante
(siempre que no sea vacía), para ir colocando a continuación (como si de una
cola se tratase) nuevos nodos con los valores contenidos en b, incrementando
adecuadamente el tamaño de la pila.
public void concatStackIF(StackIF<E> b) {
if (!b.isEmpty()) {
NodeSequence lastNode;
if (!this.isEmpty()) {
lastNode = this.getNode(this.size());
} else {
lastNode = new NodeSequence(b.getTop());
this.firstNode = lastNode;
b.pop();
}
while (!b.isEmpty()) {
NodeSequence newNode = new NodeSequence(b.getTop());
lastNode.setNext(newNode);
lastNode = newNode;
b.pop();
this.size++;
}
}
}
Dado que nos están indicando que buscamos todas las etiquetas anidadas a
cualquier profundidad del LTree llamante, deberemos hacer un recorrido del
LTree. ¿Podemos utilizar un iterador? En esta ocasión si, ya que estamos
interesados en el contenido del LTree y no necesitamos su estructura.
¿Qué recorrido nos interesa? Pues, realmente, cualquiera. No se indica que haya
que guardar ningún orden específico, por lo que elegir un recorrido u otro no
afectará a la solución.
Así pues, podemos generar un iterador (con cualquier recorrido) del LTree y
luego recorrerlo para ir construyendo la lista resultado. Para ello en cada etiqueta
comprobaremos si su nombre es “e” o no. Si no lo es, pasamos a la siguiente,
pero si lo es, comprobamos si tiene un atributo “ link” (con una llamada al
método value(“link”)). En caso de obtener una cadena no vacía, insertaremos
en la lista resultado un nuevo elemento con el valor de dicho atributo.
c) (1 Punto) Un método ListIF<String> getAttrs(…) que generalice el método
getLinks() de forma que se pueda especificar el nombre de las etiquetas y el
atributo buscado. Indique cuál sería su lista de parámetros y escriba la llamada a
getAttrs que haría el mismo trabajo que getLinks().