Documentos de Académico
Documentos de Profesional
Documentos de Cultura
leerPila Mtodo que se utiliza para realizar la carga void leerPila () throws
inicial de elementos de la pila. NumberFormatException,
IOException
eliminar Mtodo que recibe una pila (que puede void eliminarPila ()
tener elementos o no) y la devuelve vaca.
numElemPila Mtodo que devuelve el nmero de int numElemPila ()
elementos de la pila.
Excepciones (I)
pila1.inicializarPila ();
for (I = 1; I < 10; i++)
pila1.apilar (i);
j = pila1.desapilar ();
for (I = 1; I < 10; i++)
j = pila1.desapilar ();
pila1.eliminarPila ();
}
}
Algoritmos bsicos con Pilas
Tratamiento recursivo.
Ventaja: legibilidad.
Inconveniente: consumo de memoria
Justificacin:
Adecuacin de la estructura a la tcnica.
Restricciones del enunciado.
Mecnica: desapilar llamar apilar.
Terminaciones:
Pesimista: Llegar al final.
Anticipada: No llamar ms.
Ejemplos: Imprimir los elementos de una pila - Contar
los elementos de una pila
static void escribirPila (Pila pila) { static int contarPila (Pila pila) {
int elem; int elem, resul;
if (! pila.pilaVacia ()) { if (! pila.pilaVacia ()) {
elem = pila.desapilar (); elem = pila.desapilar ();
System.out.println (elem); resul = 1 + contarPila (pila);
escribirPila (pila); pila.apilar (elem);
pila.apilar (elem); }
} else resul = 0;
} return resul;
}
Obtener el duplicado de una pila
static void copiarPila (Pila pilaO, Pila pilaD) {
int elem;
if (! pilaO.pilaVacia ()) {
elem = pilaO.desapilar ();
copiarPila (pilaO, pilaD);
pilaO.apilar (elem);
pilaD.apilar (elem);
}
}
Estado inicial
2 5 2
7 3 7
3 7 3
5 2 5
if (! pilaO.pilaVacia ()) {
elem = pilaO.desapilar ();
pilaD.apilar (elem);
invertirPila (pilaO, pilaD);
7
3 2 2
2 2 3 3 3
7 5 7 5 7 5 5
5 7 7 7 7
3 2 3 2 2 2
2 3 2 3 2 3 3
7 5 7 5 7 5 7 5
Sumergir un elemento
Consideraciones:
Fase de ida: desapilamos elemento
Condicin de parada: pila.pilaVacia () (sin terminacin
anticipada)
Transicin:
Apilamos el dato que queremos sumergir
Fase de vuelta: restablecemos la pila, apilamos el
elemento
Sumergir un elemento
Fase de transicin:
apilar en pila1 o pila2 algn posible elemento pendiente.
Fase de vuelta:
apilar en pila1o pila2 segn el valor de apilar1|2.
apilar en pila3 solo cuando se corresponda con una instancia de la fase de ida en la que elem1 =
elem2
Varias Pilas: Mezclar dos Pilas (AND). (II). Argumentos
apilar1 y apilar2
Segn lo que haya ocurrido en la instancia anterior:
pendiente de apilar en pila1 en pila2
Se inicializan en la llamada externa al programa, ambas a
false.
pend1 y pend2: quedan elementos por tratar en pila1|2
si no estn vacas (!pila1|2.pilaVacia ())o que dan
elementos por tratar (apilar1|apilar2)
pend1 = (!pila1.pilaVacia () || apilar1)
pend1|2 = (!pila2.pilaVacia () || apilar2)
Varias Pilas: Mezclar dos Pilas (AND). (III). Modelo
Varias Pilas: Mezclar dos Pilas (OR). (I). Estrategia
Entrada: Dos pilas ordenadas ascendentemente (pila1 y pila2)
Salida: Pila ordenada ascendentemente (pila3) con los elementos de pila1y de pila2 sin repeticiones.
Argumentos:
pila1, pila2, pila3: clase Pila.
elem1, elem2: enteros. (No pueden ser variables locales).
apilar1, apilar2: lgicos. (Elemento pendiente de apilar).
Fase de ida:
Variables de control: pend1 y pend2 (lgicos): La pila (1 2) tiene algo pendiente de tratar.
Condicin de terminacin: Alguna de la pilas no tiene elementos por tratar (!(pend1 && pend2)
(!pend1 || !pend2).
Tratamiento:
desapilar segn proceda (utilizar apilar1|2).
Fase de transicin:
Copiar el resto de la pila no vaca en pila3 ( Llamada al mtodo copiarPila).
Tratar algn posible elemento pendiente de pila1 o pila2.
Fase de vuelta:
apilar en pila3.
apilar en pila1o pila2 segn el valor de apilar1|2.
Varias Pilas: Mezclar dos Pilas (OR). (II). Argumentos
apilar1 y apilar2
Segn lo que haya ocurrido en la instancia anterior:
pendiente de apilar en pila1 en pila2
Se inicializan en la llamada externa al programa, ambas a
false.
pend1 y pend2: quedan elementos por tratar en pila1|2
si no estn vacas (!pila1|2.pilaVacia ()) o que dan
elementos por tratar (apilar1|apilar2)
pend1 = (!pila1.pilaVacia () || apilar1)
pend1|2 = (!pila2.pilaVacia () || apilar2)
Varias Pilas: Mezclar dos Pilas (OR). (III). Modelo
Varias Pilas: Mezclar dos Pilas (OR). (IV). Simulacin (I)
Ambas pilas tienen elementos por tratar (pend1 && pend2)
if (!apilar1)
If (!apilar1)
elem1 = pila1.desapilar (); [1] elem1 = pila1.desapilar ();
if (!apilar2)
elem2 = pila2.desapilar ();
1 2
5 4 5 4
7 6 7 6
elem1 = 1 elem1 = 5
elem2 = 2 elem2 = 2
4
7 6 7 6
elem1 = 5 elem1 = 5
elem2 = 4 elem2 = 6
if (elem2<elem1) if (elem1<elem2)
mezclarPila(pila1,pila2,pila3,true,false,true,5,4); mezclarPila (pila1,pila2,pila3,false,true,5,6);
[3] [4]
pila2.apilar (4); pila1.apilar (5);
pila3.apilar (4); pila3.apilar (5);
Varias Pilas: Mezclar dos Pilas (OR). (IV). Simulacin (III)
Ambas pilas tienen elementos por tratar (aux1 && aux2)
[5] pend1; ! pend2; apilar1
[4] if (apilar1)
pila1.apilar (elem1);
if (!apilar1) pila3.apilar (elem1);
elem1 = pila1.desapilar ();
7 7 7
elem1 = 7
elem2 = 6
Si elem1 elem2, llamada recursiva con los valores oportunos de apilar1 y apilar2.
Fase de vuelta:
apilar en pila1o pila2 segn el valor de apilar1|2.
Se devuelve el resultado a la instancia de llamada.
En resumen. A la hora de manipular un TAD
Qu tipo de problema? Crear un TAD a partir de otro, modificar el
contenido, realizar clculos con los elementos del TAD
Parmetros:
TAD por referencia.
Otros argumentos: por referencia o por valor?.
Cules estn implcitos en el enunciado y cules no pero son necesarios
Requieren inicializacin? Dnde los inicializo (fuera del mdulo
recursivo, o dentro)?
Condicin de parada
Finalizacin anticipada: circunstancia que la provoca
Diseo:
Fase de ida: desapilar (+ operaciones)
Transicin: se alcanza la condicin de parada y se realiza el proceso
correspondiente
Fase de vuelta: (Operaciones +) apilar
Recapitulamos.
Especificacin de un TAD:
Propiedades sintcticas, propiedades semnticas y
excepciones
TAD Pila
Estructura LIFO (Last Input First Output)
Recursividad
Fase de ida fase de transicin fase de vuelta
Desapilar Procesar Apilar