Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Pilas de enteros en
Java
Oswaldo Vélez Langs, PhD
oswaldovelez@correo.unicordoba.edu.co
Programación II
TAD PILA
1
17/11/2017
* Se lanza una excepción (PilaVacia) si se intenta utilizar alguna de estas operaciones cuando la
pila está vacía
2
17/11/2017
leerPila Método que se utiliza para realizar la carga void leerPila () throws
inicial de elementos de la pila. NumberFormatException,
IOException
eliminar Método que recibe una pila (que puede void eliminarPila ()
tener elementos o no) y la devuelve vacía.
numElemPila Método que devuelve el número de int numElemPila ()
elementos de la pila.
Excepciones (I)
• Excepción: circunstancia que produce que una operación válida sobre un
TAD no se pueda efectuar.
• Ejemplos:
apilar:
Al intentar apilar un nuevo elemento en la pila, ésta está llena. La operación apilar no debe
producir ningún efecto.
desapilar, cima, decapitar:
Al intentar desapilar un elemento de la pila, obtener su cima o decapitarla, ésta está vacía.
Estas operaciones no deben producir ningún efecto
3
17/11/2017
Excepciones (II)
• Para especificar completa y correctamente cada operación válida de un TAD
se debe indicar:
Especificaciones Sintácticas.
Especificaciones Semánticas.
Excepciones: Se indicarán como parte de las especificaciones semánticas.
4
17/11/2017
Situaciones de excepción
public class pruebaPila2 {
public static void main (String [] args) throws PilaVacia {
Pila pila1 = new TadPila ();
int i, j;
5
17/11/2017
• Terminaciones:
“Pesimista”: Llegar al final.
Anticipada: No llamar más.
6
17/11/2017
Estado inicial
2 5 2
7 3 7
3 7 3
5 2 5
7
17/11/2017
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 un elemento.
Condición de parada: pila.pilaVacia () (sin terminación anticipada).
Transición:
Apilamos el dato que queremos sumergir.
Fase de vuelta: restablecemos la pila, apilando el elemento desapilado a la ida.
8
17/11/2017
Sumergir un elemento
static void sumergir (Pila pila, int dato) throws PilaVacia {
int elem;
if (!pila.pilaVacia ()) {
elem = pila.desapilar ();
sumergir (pila, dato);
pila.apilar (elem);
}
else pila.apilar (dato);
}
9
17/11/2017
Terminación anticipada
• Parar la ejecución del programa antes de alcanzar la condición
de parada si se cumple determinada condición
No se realizan más llamadas recursivas.
• Condición de parada pesimista: pilaVacia.
• Ejemplo: buscar un valor.
Condición de parada pesimista: pilaVacia
Terminación anticipada: existe dato → no se realizan más
llamadas recursivas
• Fase de ida:
desapilar elem de pila y comparar con dato
Si igual → termino llamadas recursivas
Si no → llamada a funcion recursiva
Fase de vuelta: apilar elem en pila
10
17/11/2017
Buscar un valor
static boolean esta (Pila pila, int dato) throws PilaVacia{
int elem;
boolean resul;
if (!pila.pilaVacia ()) {
Terminación
elem = pila.desapilar ();
anticipada
if (elem == dato)
resul = true;
else resul = esta (pila,dato);
pila.apilar (elem);
} Terminación
else resul = false; pesimista
return resul;
}
• 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: lógicos. (Elemento pendiente de apilar).
• Fase de ida:
Variables de control: pend1 y pend2 (lógicos): La pila (1 ó 2) tiene algo pendiente de tratar.
Condición de terminación: Alguna de la pilas no tiene elementos por tratar (!(pend1 && pend2) ≡
(!pend1 || !pend2).
Tratamiento:
desapilar según proceda (utilizar apilar1|2).
Comparar elementos de pila1 y pila2.
Llamada recursiva con los valores oportunos de apilar1 y apilar2.
• Fase de transición:
apilar en pila1 o pila2 algún posible elemento pendiente.
• Fase de vuelta:
apilar en pila1o pila2 según 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
11
17/11/2017
12
17/11/2017
• 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: lógicos. (Elemento pendiente de apilar).
• Fase de ida:
Variables de control: pend1 y pend2 (lógicos): La pila (1 ó 2) tiene algo pendiente de tratar.
Condición de terminación: Alguna de la pilas no tiene elementos por tratar (!(pend1 && pend2) ≡ (!pend1 ||
!pend2).
Tratamiento:
desapilar según proceda (utilizar apilar1|2).
Comparar elementos de pila1 y pila2.
Llamada recursiva con los valores oportunos de apilar1 y apilar2.
• Fase de transición:
Copiar el resto de la pila no vacía en pila3 ( Llamada al método copiarPila).
Tratar algún posible elemento pendiente de pila1 o pila2.
• Fase de vuelta:
apilar en pila3.
apilar en pila1o pila2 según el valor de apilar1|2.
13
17/11/2017
1 2
5 4 5 4
7 6 7 6
elem1 = 1 elem1 = 5
elem2 = 2 elem2 = 2
14
17/11/2017
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);
} }
7 7 7
elem1 = 7
elem2 = 6
15
17/11/2017
16
17/11/2017
Fase de transición:
Por terminación anticipada: Se apilan los elementos pendientes en pila1 y pila2
Se devuelve false.
Por terminación pesimista. Posibilidades:
Se ha terminado con pila2 (y no con pila1).
Se apila el elemento pendiente de pila1
Se devuelve true.
Se ha terminado con pila1 (y no con pila2).
Se apila el elemento pendiente de pila2
Se devuelve false.
Se ha terminado con ambas pilas.
Se devuelve true.
Fase de vuelta:
apilar en pila1o pila2 según 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 cálculos con los elementos del TAD
• Parámetros:
TAD por referencia.
Otros argumentos: ¿por referencia o por valor?.
Cuáles están implícitos en el enunciado y cuáles no pero son necesarios
¿Requieren inicialización? ¿Dónde los inicializo (fuera del módulo
recursivo, o dentro)?
• Condición de parada
• Finalización anticipada: circunstancia que la provoca
• Diseño:
Fase de ida: desapilar (+ operaciones)
Transición: se alcanza la condición de parada y se realiza el proceso
correspondiente
Fase de vuelta: (Operaciones +) apilar
17