La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Igor Santos Grueiro. De este tipo de pilas NO vamos a hablar.

Presentaciones similares


Presentación del tema: "Igor Santos Grueiro. De este tipo de pilas NO vamos a hablar."— Transcripción de la presentación:

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

5

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]; }

26

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

44

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


Descargar ppt "Igor Santos Grueiro. De este tipo de pilas NO vamos a hablar."

Presentaciones similares


Anuncios Google