Descargar la presentación
La descarga está en progreso. Por favor, espere
Publicada porDomitila Ferrera Modificado hace 9 años
1
Igor Santos Grueiro
2
De este tipo de pilas NO vamos a hablar
3
¿ Qué es una pila?
4
Tengo una pila de fichas
6
Tengo una pila de galletas
7
Objeto Una pila es una estructura formada por una secuencia de 0 a N elementos, en la que se extraen los elementos en orden inverso al de inserción Objeto Pila Apilar/Push Desapilar/Pop Cima de la pila
8
En un pila sólo se hacen operaciones con la cima de la pila Es un tipo de estructura LIFO (Last Input First Output)
9
Podemos hacer varias operaciones :
10
Crear una pila
11
Objeto Vaciar una pila Objeto
12
Comprobar sí una pila está vacía Objeto NOSÍ
13
Obtener una copia del elemento en la cima Objeto
14
Insertar un elemento en la cima Objeto Se conoce como apilar o “push”
15
Recoger y eliminar de la pila el elemento cima Objeto Se conoce como desapilar o “pop”
16
Vamos a construir la clase o tipo pila
17
Una pila se puede construir: De forma estática De forma dinámica
18
De forma estática: la pila tiene un tamaño fijo public class PilaEstatica { private Object [] elementos; private int cont; public PilaEstatica(int tamaño){ elementos = new Object[tamaño]; cont = 0; for (int i=0; i< elementos.length; i++){ elementos [i] = null; } //… }
19
//… public void vaciar(){ for (int i = 0; i < this.contador; i++){ this.elementos[i] = null; } //… Para vaciar ponemos a null los elementos insertados
20
//… public boolean estaVacia(){ return (cont == 0); } //… Para comprar si está vacía miramos al contador
21
//… public void push(Object x){ if (cont != this.elementos.length){ this.elementos[cont] = x; cont++; } else{ System.out.println(“Error, Pila llena”); } //… Para insertar un elemento se añade al array en la posición del contador
22
//… public Object cima(){ if (cont > 0){ return this.elementos[cont - 1]; }else{ return null;} //… Para devolver el elemento en la cima se mira la posición del contador public Object cima(){ return v[cont-1]; }
23
//… public Object borrar(){ if (cont != 0){ this.cont--; this.elementos[cont] = null; }else{ System.out.println (“Error, la pila esta vacia”); } //… Para borrar el elemento en la cima se pone a null la posición del contador (-1) public Object cima(){ return v[cont-1]; }
24
//… public Object pop(){ if (cont == 0){ return null; } else { cont--; Object temp = this.elementos[cont] ; this.elementos[cont] = null; return temp; } //… Para desapilar el elemento en la cima se recupera y se borra el elemento de la cima public Object cima(){ return v[cont-1]; }
25
//… public int tamanyo(){ return cont; } //… También, podemos recuperar el número de elementos insertados en la pila public Object cima(){ return v[cont-1]; }
27
Pero, ¿y cuándo no sabemos cuántos elementos vamos a insertar?
28
Nos hace falta una estructura que enlace un elemento al siguiente Object elemento Nodo siguiente Nodo
29
public class NodoPilaDinamica{ private Object elemento; private NodoPilaDinamica siguiente; public NodoPilaDinamica(Object elemento, NodoPilaDinamica siguiente){ this.elemento = elemento; this.siguiente = siguiente; } public NodoPilaDinamica(Object elemento){ this.elemento = elemento; this.siguiente = null; } public Object getElemento(){ return elemento; } public NodoPilaDinamica getSiguiente(){ return siguiente; } }
30
Ahora la clase PilaDinamica
31
public class PilaDinamica{ private NodoPilaDinamica cima; private int cont; public PilaDinamica(){ this.cima = null; this.cont = 0; } //… } }
32
//… public void vaciar(){ this.cima = null; this.cont = 0; } //… Para vaciar ponemos a null la cima
33
//… public boolean estaVacia(){ return (this.cima == null); } //… Para comprobar si está vacía miramos si la cima es null
34
//… public void push(Object x){ this.cima = new NodoPilaDinamica(x, this.cima); this.cont++; } //… Para insertar un elemento se añade un elemento como siguiente de la cima y se actualiza la cima
35
Cima
36
//… public Object cima(){ if (this.cima != null){ return this.cima.getElemento(); } else { return null; } //… Para devolver el elemento en la cima se devuelve el elemento de la cima public Object cima(){ return v[cont-1]; }
37
//… public void borrar(){ if (this.cima != null){ this.cima = this.cima.getSiguiente(); this.cont--; } //… Para borrar el elemento en la cima se pone la cima al valor siguiente de la cima previa public Object cima(){ return v[cont-1]; }
38
Cima
39
//… public Object pop(){ if (this.cima == null){ return null; } else { this.cont--; NodoPilaDinamica nodoTmp = this.cima; this.cima = this.cima.getSiguiente(); return nodoTmp.getElemento(); } //… Para desapilar el elemento en la cima se recupera y se borra el elemento de la cima public Object cima(){ return v[cont-1]; }
40
Cima Se devuelve el objeto contenido en el nodo Objeto
41
//… public int tamanyo(){ return cont; } //… También, podemos recuperar el número de elementos insertados en la pila public Object cima(){ return v[cont-1]; }
42
Y, ¿ para qué sirven las pilas?
43
Podemos implementar recursividad
45
Ejercicio 1 (I) Una aplicación muy típica es verificar que una expresión matemática contiene paréntesis emparejados.
46
Ejercicio 1 (II) Por ejemplo, los paréntesis de la siguiente expresión: 2 – (3 * (8 - (7 - 5)) –4 * (5 + 1)) están emparejados, porque cada paréntesis abierto tiene un paréntesis de cierre correspondiente y posterior a él, y además no existen paréntesis abiertos o cerrados sin pareja correspondiente.
47
Ejercicio 1 (III) El modo de comprobar cuándo una expresión contiene los paréntesis correctos es recorrerla de izquierda a derecha: según se encuentran paréntesis de cierre ‘)’, se encajan con el ultimo paréntesis abierto ‘(‘ encontrado en la expresión y aún no emparejado.
48
Ejercicio 1 (IV) Los paréntesis están bien emparejados si: a)Cada vez que se encuentra un ‘)’, hay aún un ‘(‘ no emparejado previo. b)Cuando alcanza el final de la expresión, se han emparejado todos los ‘(‘.
49
Ejercicio 1 (V) La solución requiere memorizar los paréntesis de apertura y descartar uno cada vez que se encuentra uno de cierre. De este modo es muy fácil hacerlo utilizando una pila.
50
Ejercicio 1 (VI) Diseñar el programa teniendo en cuenta que la expresión matemática que hay que comprobar si es o no correcta con respecto a sus paréntesis es introducida por teclado como un dato de tipo String.
51
Ejercicio 1 (VII) Hay que utilizar: char charAt( int posicion) public String substring(int inicio, int fin)
52
Las pilas son una estructura fundamental de la computación
Presentaciones similares
© 2024 SlidePlayer.es Inc.
All rights reserved.