Sie sind auf Seite 1von 8

TEMA 8 EDAs lineales y su jerarqua Java Implementacin de las Edas Lineales

EJERCICIOS RESUELTOS

Ejercicio 1.- Disese la clase LEGPila que implementa el interfaz Pila utilizando una Lista Enlazada. Estdiese la complejidad temporal de sus mtodos.

Solucin:
public class LEGPila<E> implements Pila<E> { // Atributos protected NodoLEG<E> tope; // Constructor public LEGPila() { tope = null; } // Inserta x en el tope de la Pila public void apilar(E x) { tope = new NodoLEG<E>(x, tope); } // SII !esVacia(): elimina el dato del tope de la Pila y lo devuelve public E desapilar() { E dato = tope.dato; tope = tope.siguiente; return dato; } // SII !esVacia(): obtiene el dato que ocupa el tope de la Pila public E tope() { return tope.dato; } // Comprueba si la Pila est o no vaca public boolean esVacia() { return (tope == null); } }

Todos los mtodos son de orden constante.

Ejercicio 2.- Enriquecer el interfaz Pila y las clases ArrayPila y LEGPila con dos nuevas operaciones: E borraBase(), que borra el dato situado en la base de la Pila void topeBase(), que intercambia el dato que ocupa el tope de la Pila con el que ocupa su base Solucin:
public interface PilaExt<E> extends Pila<E> { E borraBase(); // SII !esVacia(): borra la base void topeBase(); // SII !esVacia(): intercambia tope y base } public class ArrayPilaExt<E> extends ArrayPila<E> implements PilaExt<E> { public E borraBase() { // SII !esVacia() E base = elArray[0]; for (int i = 1; i <= tope; i++) elArray[i1] = elArray[i]; tope--; return base; } public void topeBase() { E temp = elArray[0]; elArray[0] = elArray[tope]; elArray[tope] = temp; } } // SII !esVacia()

public class LEGPilaExt<E> extends LEGPila<E> implements PilaExt<E> { public E borraBase() { NodoLEG <E> aux = tope, ant = null; while (aux.siguiente != null) { ant = aux; aux = aux.siguiente; } if (ant == null) tope = null; else ant.siguiente = null; return aux.dato; } // SII !esVacia()

public void topeBase() { // SII !esVacia() NodoLEG<E> aux = tope; while (aux.siguiente != null) aux = aux.siguiente; E temp = aux.dato; aux.dato = tope.dato; tope.dato = temp; } }

Ejercicio 3.- Supngase que el tamao del array sobre el que se guardan los datos de la Cola es 4. Cul ser su contenido y los valores de los atributos primero, fin y talla despus de cada una de las siguientes instrucciones?
Cola <Integer> q = new ArrayCola <Integer> (); q.encolar(new Integer(5)); q.encolar(new Integer(3)); q.encolar(new Integer(7)); q.encolar(new Integer(9)); q.desencolar(); q.encolar(new Integer(5)); q.desencolar(); q.encolar(new Integer(3)); q.encolar(new Integer(1));

Solucin:
elArray Cola<Integer> q = new ArrayCola<Integer>(); q.encolar(new Integer(5));
5

primero 0

fin -1

talla 0

q.encolar(new Integer(3));

q.encolar(new Integer(7));

q.encolar(new Integer(9));

q.desencolar();

q.encolar(new Integer(5));

q.desencolar();

q.encolar(new Integer(3));

q.encolar(new Integer(1));

Ejercicio 4.- Implemntese el interfaz Cola utilizando una Lista Enlazada y estdiese la complejidad temporal de sus mtodos. Solucin:
public class LEGCola<E> implements Cola<E> { // Atributos protected NodoLEG<E> primero, fin; // Constructor public LEGCola() { primero = null; fin = null; } // Inserta x al final de la Cola public void encolar(E x) { NodoLEG <E> nuevo = new NodoLEG <E> (x); if (fin == null) primero = nuevo; else fin.siguiente = nuevo; fin = nuevo; } // SII !esVacia(): elimina y devuelve el primer dato de la Cola public E desencolar() { E dato = primero.dato; primero = primero.siguiente; if (primero == null) fin = null; return dato; } // SII !esVacia(): devuelve el primer dato de la Cola public E primero() { return primero.dato; } // Comprueba si la Cola est o no vaca public boolean esVacia() { return (primero == null); } }

Todos los mtodos son de orden constante.

Ejercicio 5.- Aadir a la clase LEGListaConPI las siguientes operaciones: localiza(x): si x est en la lista sita el PI sobre su primera aparicin y sino lo sita al final eliminar(x): si x est en la lista borra su primera aparicin y sino sita el PI al final anterior(): sita el PI sobre el dato anterior al que actualmente ocupa; no est definida si el PI actual apunta al primer dato de la lista

Solucin:
public class LEGListaConPI<E> implements ListaConPI<E> { ... public void localiza(E x) { ant = pri; while (ant != ult && !ant.siguiente.dato.equals(x)) ant = ant.siguiente; } public void eliminar(E x) { ant = pri; while (ant != ult && !ant.siguiente.dato.equals(x)) ant = ant.siguiente; if (ant != ult) { if (ant.siguiente == ult) ult = ant; ant.siguiente = ant.siguiente.siguiente; } } public void anterior() { // SII ant != pri NodoLEG<E> aux = pri; if (aux != ant) { while (aux.siguiente != ant) aux = aux.siguiente; ant = aux; } } }

Ejercicio 6.- El interfaz Secuencia define una EDA Lineal en la que el acceso se realiza por la posicin que ocupa el dato en la coleccin:
public interface Secuencia <E> { void insertar(E x); // Inserta x al final int indiceDe(E x); // Devuelve la posicin de x // Excepcin si indice<0 o indice>=talla() E recuperar(int indice) throws PosicionIncorrecta; boolean esVacia(); // Comprueba si est vaca // Elimina la primera aparicin de x en la secuencia E borrar(E x) throws ElementoNoEncontrado; int talla(); // Devuelve el nmero de elementos E[] toArray(); // Devuelve un array con los elementos }

Se pide: Implementar el interfaz Secuencia utilizando para los datos una representacin contigua: la clase ArraySecuencia Implementar el interfaz Secuencia utilizando para los datos una representacin enlazada: la clase LEGSecuencia Discutir, en trminos de coste cul de estas implementaciones es ms adecuada

Solucin:
Clase ArraySecuencia:

public class ArraySecuencia<E> implements Secuencia<E> { private E elArray[]; private int talla; private static final int CAPACIDAD_POR_DEFECTO = 100; @SuppressWarnings(unchecked) public ArraySecuencia() { elArray = (E []) new Object[CAPACIDAD_POR_DEFECTO]; talla = 0; } public void insertar(E x) { if (talla == elArray.length) duplicarArray(); elArray[talla++] = x; } public int indiceDe(E x) { int indice = -1; for (int i = 0; (i < talla) && (indice == -1); i++) if (elArray[i].equals(x)) indice = i; return indice; } public E recuperar(int indice) throws PosicionIncorrecta { if (indice < 0 || indice >= talla) throw new PosicionIncorrecta(ndice no vlido); return elArray[indice]; } public boolean esVacia() { return (talla == 0); } public E borrar(E x) throws ElementoNoEncontrado { int indice = indiceDe(x); if (indice == -1) throw new ElementoNoEncontrado(x + no est); E res = elArray[indice]; talla--; for (int i = indice; i < talla; i++) elArray[i] = elArray[i+1]; return res; } public int talla() { return talla; } @SuppressWarnings(unchecked) public E[] toArray() { E nuevoArray[] = (E []) new Object[talla]; for (int i = 0; i < talla; i++) nuevoArray[i] = elArray[i]; return nuevoArray; }

@SuppressWarnings(unchecked) private void duplicarArray() { E nuevoArray[] = (E []) new Object[elArray.length*2]; for (int i = 0; i < talla; i++) nuevoArray[i] = elArray[i]; elArray = nuevoArray; } }

Clase LEGSecuencia:

public class LEGSecuencia<E> implements Secuencia<E> { private NodoLEG<E> pri, ult; private int talla; public LEGSecuencia() { pri = ult = null; talla = 0; } public void insertar(E x) { NodoLEG <E> nuevo = new NodoLEG <E> (x); if (ult == null) pri = nuevo; else ult.siguiente = nuevo; ult = nuevo; talla++; } public int talla() { return talla; } public int indiceDe(E x) { int indice = -1; NodoLEG <E> aux = pri; for (int i = 0; (i < talla) && (indice == -1); i++) { if (aux.dato.equals(x)) indice = i; else aux = aux.siguiente; } return indice; } public E recuperar(int indice) throws PosicionIncorrecta { if ((indice < 0) || (indice >= talla)) throw new PosicionIncorrecta(Fuera de rango: + indice); NodoLEG <E> aux = pri; for (; indice > 0; indice--) aux = aux.siguiente; return aux.dato; } public boolean esVacia() { return (talla == 0); }

public E borrar(E x) throws ElementoNoEncontrado { NodoLEG <E> aux = pri, ant = null; while ((aux != null) && (!aux.dato.equals(x))) { ant = aux; aux = aux.siguiente; } if (aux == null) throw new ElementoNoEncontrado(x + no est); E res = aux.dato; if (ant == null) pri = pri.siguiente; else ant.siguiente = aux.siguiente; if (aux == ult) ult = ant; talla--; return res; } @SuppressWarnings(unchecked) public E[] toArray() { E nuevoArray[] = (E []) new Object[talla]; NodoLEG <E> aux = pri; for (int i = 0; i < talla; i++) { nuevoArray[i] = aux.dato; aux = aux.siguiente; } return nuevoArray; } }

Implementacin ms adecuada?:

Mtodo insertar indiceDe recuperar esVacia borrar talla toArray

ArraySecuencia constante lineal constante constante lineal constante lineal

LEGSecuencia constante lineal lineal constante lineal constante lineal

Es ms eficiente la implementacin mediante un array.

Das könnte Ihnen auch gefallen