Tema 5. Estructura de datos Pila http://aulavirtual.uji.es José M. Badía, Begoña Martínez, Antonio Morales y José M. Sanchiz {badia, bmartine, morales, sanchiz}@icc.uji.es Estructuras de datos y de la información Universitat Jaume I Índice 1. Definición y aplicaciones 5 2. Tipo Abstracto de Datos Pila 10 3. La clase stack 11 4. Implementación estática 12 Bibliografía ä (Nyhoff’06), Capítulo 7 ä (Main y Savitch’01), Capítulo 7 ä (Drozdek’01), Capítulo 4 Tema 5. Estructura de datos Pila – 3 / 20 I testtesttesttesttest Objetivos ä Conocer el concepto, funcionamiento y utilidad del tipo Pila. ä Conocer el TAD Pila y sus operaciones asociadas. ä Saber utilizar el tipo Pila para resolver problemas. ä Saber implementar el tipo Pila mediante el uso de vectores. Tema 5. Estructura de datos Pila – 4 / 20 I testtesttesttesttest 1 Definición y aplicaciones ä Pila=Estructura lineal manejada siguiendo una política LIFO: Last In First Out. ä Tope: Posición en la que se insertan y eliminan elementos de la pila. ä Concepto manejado de modo cotidiano: pila de platos, bandejas, ... Tema 5. Estructura de datos Pila – 5 / 20 I testtesttesttesttest 1 Definición y aplicaciones (II) ä Operaciones de manipulación: í Apilar: Añade un elemento en la posición siguiente al tope actual. í Desapilar: Elimina el elemento situado en el tope. Apilar Apilar Apilar tope tope tope E1 Tema 5. Estructura de datos Pila – 6 / 20 I testtesttesttesttest E2 E1 Desapilar Apilar E3 E2 E1 tope tope E2 E1 E4 E2 E1 1 Definición y aplicaciones (III) ä La Pila es una estructura de datos dinámica. í Su tamaño no queda definido en tiempo de compilación. í Las operaciones del TAD permiten modificar su tamaño. ¿ Restricciones de tamaño? Tema 5. Estructura de datos Pila – 7 / 20 I testtesttesttesttest 1 Definición y aplicaciones (IV) Aplicación. Llamadas a procedimiento ä Problemas en los que los datos se manejan siguiendo una política LIFO. r-1: r: PROGRAM P PROC A1(); PROC A2(); PROC A3(); . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A3(); . . . . . . . . . . . . . . . . . . . . A1(); s-1: . . . . A2(); s: t-1: . . . . . . . . t: . . . . END. END; END; END; t r Tras llamar a A1 Tema 5. Estructura de datos Pila – 8 / 20 I testtesttesttesttest s s s r r r r Tras llamar a A3 Al volver de A3 Al volver de A2 Tras llamar a A2 1 Definición y aplicaciones (V) Una Pila es una estructura ordenada, lineal y homogénea, en la que podemos insertar o extraer elementos en una única posición llamada Tope, siguiendo una política LIFO. ä Ordenada: Los elementos se sitúan en un cierto orden. Sus valores NO tienen porque estar ordenados. ä Homogénea: Todos los elementos son del mismo tipo. Pueden ser de cualquier tipo: simple o compuesto. Tema 5. Estructura de datos Pila – 9 / 20 I testtesttesttesttest 28 a v p g 7 t b e r 12 m t v e 2 Tipo Abstracto de Datos Pila TAD Pila Axiomas: ∀ S∈Pila, ∀ e∈tb, Usa logico, tb 1) PilaVacia(CrearPila) = Verdadero Operaciones: 2) PilaVacia(Apilar(S,e)) = Falso CrearPila: → Pila 3) Desapilar(CrearPila) = error PilaVacia: Pila → logico 4) Desapilar(Apilar(S,e)) = S Tope: Pila → tb 5) Tope(CrearPila) = error Apilar: Pila x tb → Pila 6) Tope(Apilar(S,e)) = e Desapilar: Pila → Pila Tema 5. Estructura de datos Pila – 10 / 20 I testtesttesttesttest 3 La clase stack class s t a c k { public : stack ( ) ; bool empty ( ) const ; const i n t & t o p ( ) const ; void push ( const i n t & dato ) ; void pop ( ) ; private : ... }; Tema 5. Estructura de datos Pila – 11 / 20 I testtesttesttesttest 4 Implementación estática Diferencias entre vector y Pila Vector Pila ä Puede accederse a cualquiera de ä Sólo puede accederse al elemento sus elementos. ä Tiene un número limitado de elementos. situado en el tope. ä No tiene restricciones teóricas de tamaño. Cuestión de implementación ä Los vectores tienen un tamaño limitado ⇒ Pueden llenarse. ¿PilaLlena? Tema 5. Estructura de datos Pila – 12 / 20 I testtesttesttesttest 4 Implementación estática (II) Primera opción Pila = vector ä La posición del tope se mantiene fija en el elemento 0 del vector. ä Los elementos se desplazan al apilar y desapilar. tope 8 tope 5 8 tope 1 5 8 tope 9 1 tope 5 8 Problema ä Coste elevado de las operaciones apilar y desapilar. Tema 5. Estructura de datos Pila – 13 / 20 I testtesttesttesttest 1 5 8 tope 3 1 5 8 4 Implementación estática (III) Segunda opción Pila = vector + entero ä El vector guarda los elementos de la pila. ä El entero indica la posición "móvil" del tope. Clase Pila e8 e7 tope • • • e1 Tipo abstracto Ventaja ä Coste constante de las operaciones. Tema 5. Estructura de datos Pila – 14 / 20 I testtesttesttesttest 8 atributo tope MaxElem e1 ... e7 e8 ... atributo elementos Implementación mediante un vector 4 Implementación estática (IV) Definición del tipo - fichero stack.h # i f n d e f STACK # d e f i n e STACK const i n t MaxElem = 1 2 8 ; class s t a c k { public : / / D e f i n i c i ó n de l a s operaciones p ú b l i c a s private : i n t elementos [ MaxElem ] ; i n t tope ; }; #endif Tema 5. Estructura de datos Pila – 15 / 20 I testtesttesttesttest 4 Implementación estática (V) ä Implementación de las operaciones - fichero stack.cpp / ∗ Crea una p i l a v a c í a ∗ / stack : : stack ( ) { tope = − 1; } / ∗ Comprueba s i l a p i l a e s t a v a c í a ∗ / bool s t a c k : : empty ( ) const { r e t u r n ( tope = = − 1 ) ; } Tema 5. Estructura de datos Pila – 16 / 20 I testtesttesttesttest 4 Implementación estática (VI) / ∗ Devuelve e l elemento s i t u a d o en e l tope ∗ / const i n t & s t a c k : : t o p ( ) const { i f ( ! empty ( ) ) r e t u r n elementos [ tope ] ; else cerr << " Error : P i l a vacia " < < endl ; } ä Devuelve el elemento, NO lo desapila Tema 5. Estructura de datos Pila – 17 / 20 I testtesttesttesttest 4 Implementación estática (VII) / ∗ A p i l a un elemento " por encima " d e l tope ∗ / void s t a c k : : push ( const i n t & dato ) { i f ( tope < MaxElem − 1 ) { / / ¿ F i n a l d e l v e c t o r ? ++ tope ; elementos [ tope ] = dato ; } else c e r r < < " Error : P i l a l l e n a " < < endl ; } Tema 5. Estructura de datos Pila – 18 / 20 I testtesttesttesttest 4 Implementación estática (VIII) / ∗ D e s a p i l a e l elemento s i t u a d o en e l tope ∗ / void s t a c k : : pop ( ) { i f ( ! empty ( ) ) tope −−; else cerr << " Error : P i l a vacia " < < endl ; } ä El elemento no se "borra"del vector tope 4 elementos d m e l s 0 1 3 4 2 Tema 5. Estructura de datos Pila – 19 / 20 I testtesttesttesttest ••• tope 3 elementos d m e l s 0 1 3 4 2 ••• 4 Implementación estática (IX) ä Problema Array: estructura estática Pila: estructura dinámica ä Consecuencias í Reserva de un espacio fijo en tiempo de compilación. í Posibilidad de llenado del vector ⇒ Llenado de la pila. í Espacio reservado máximo ⇒ Desaprovechamiento de memoria. ä Solución í Uso de memoria dinámica. Tema 5. Estructura de datos Pila – 20 / 20 I testtesttesttesttest