PILAS ESTRUCTURAS DE DATOS 2006 Prof. Ing. M.Sc. Fulbia Torres UNIDAD II ESTRUCTURAS DE DATOS PILAS Definición. Operaciones. Implementación secuencial. Aplicaciones. Ejemplos. Ejercicios. Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006 PILA DEFINICIÓN Una PILA (o stack) es una estructura ordenada y homogénea, en la que podemos añadir o quitar elementos solamente en un extremo de la estructura. El extremo donde se realizan estas operaciones se denomina habitualmente TOPE. Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006 PILA DEFINICIÓN Se dice que es una estructura ordenada, porque sus elementos se sitúan siguiendo un cierto orden, no que estén ordenados en función de su valor. Se dice que se trata de una estructura homogénea, porque todos sus elementos son del mismo tipo, pueden ser tanto simples (enteros, reales,…) como compuestos (registros, vectores, ...) Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006 PILA DEFINICIÓN Dada una pila P, formada por los elementos a, b, c, ..., k (P=(a,b,c,...,k)), se dice que a, que es el elemento más inaccesible de la pila, está en el fondo de la pila (bottom) y que k, por el contrario, el más accesible, está en el tope. Las restricciones definidas para la pila implican que si una serie de elementos A, B, C, D, E, F se añaden, en este orden, a una pila entonces el primer elemento que se elimine (borre) de la estructura deberá ser F. Por tanto, resulta que el último elemento que se inserta en una pila es el primero que se borra. Por esa razón, se dice que la pila sigue una politica de tipo LIFO (Last In First Out, el último que entra es el primero que sale). Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006 PILA DEFINICIÓN Un ejemplo típico de pila lo constituye un montón de platos: Cuando se quiere introducir un nuevo plato, éste se coloca en la posición más accesible, encima del último plato. Cuando se agarra un plato, éste se extrae, igualmente, del punto más accesible, el último que se ha introducido. Otro ejemplo sería una caja llena de libros. Sólo podemos ver cuál es el libro que está más arriba en la caja, y si ponemos o agarramos un libro, sólo podremos actuar sobre este primer libro. No podemos siquiera saber el número total de libros guardados en la pila. Sólo sabremos el número de elementos de la pila de libros si previamente los sacamos hasta vaciar la caja. Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006 PILA CARACTERÍSTICAS Una PILA es un objeto dinámico que cambia constantemente. Son muy utilizadas en programación para evaluar expresiones, reconocer lenguajes, recorrer árboles y simular procesos recursivos. Sobre una pila se pueden realizar operaciones que permiten acceder y manipular los elementos almacenados en la misma. Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006 PILA OPERACIONES Veamos cual es la especificación formal del tipo de datos abstracto pila: TAD: pila Operaciones: CONSTRUCTORA Crea una pila vacía. CrearPila: Pila Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006 PILA OPERACIONES MODIFICADORAS Dada una pila p y un valor e, del tipo base, devuelve una nueva pila formada al apilar en p el nuevo elemento sobre la posición indicada por el valor del tope. AdicPila: Pila x tipo_base Pila Dada una pila, elimina el elemento indicado por el valor del tope y devuelve la nueva pila. ElimPila: Pila Pila Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006 PILA OPERACIONES ANALIZADORAS Devuelve el valor del elemento que está apuntado por el tope. InfoPila: Pila tipo_base Devuelve el valor verdadero si la pila está vacía y falso en caso contrario. PilaVacia: Pila lógico Devuelve el valor verdadero si la pila está llena y falso en caso contrario. PilaLlena: Pila lógico Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006 PILA OPERACIONES DESTRUCTORA Destruye la pila retornando toda la memoria ocupada. DestruirPila: Pila Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006 PILA OPERACIONES Eliminar Adicionar Tope PILA Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006 PILA IMPLEMENTACIÓN ESTÁTICA (Mediante Arreglos) DEFINICIÓN # define MAXELEM número máximo de elementos struct tipopila { int tope; tipo_base elementos [MAXELEM]; } struct tipopila p; Ing. M.Sc. Fulbia Torres ING. MSc.Estructuras FULBIA TORRES Asignatura: de Datos ASIGNATURA: ESTRUCTURAS DE DATOS Barquisimeto 2006 BARQUISIMETO 2005 PILA IMPLEMENTACIÓN ESTÁTICA (Mediante Arreglos) Con esta definición de Pila las operaciones asociadas especificadas en el TAD quedarían del siguiente modo: Crea una pila vacía. int CrearPila (struct tipopila *p) { return (*p).tope = -1; } Ing. M.Sc. Fulbia Torres ING. MSc.Estructuras FULBIA TORRES Asignatura: de Datos ASIGNATURA: ESTRUCTURAS DE DATOS Barquisimeto 2006 BARQUISIMETO 2005 PILA IMPLEMENTACIÓN ESTÁTICA (Mediante Arreglos) Dada una pila p y un valor e, del tipo base, devuelve una nueva pila formada al apilar en p el nuevo elemento sobre la posición indicada por el valor del tope. void AdicPila (struct tipopila *p, tipo_base valor) { if PilaLlena (p) { cout << "Pila Overflow \n"; exit (1); } else (*p).elementos[++ ((*p).tope) ] = valor; } Ing. M.Sc. Fulbia Torres ING. MSc.Estructuras FULBIA TORRES Asignatura: de Datos ASIGNATURA: ESTRUCTURAS DE DATOS Barquisimeto 2006 BARQUISIMETO 2005 PILA IMPLEMENTACIÓN ESTÁTICA (Mediante Arreglos) Dada una pila, elimina el elemento indicado por el valor del tope y devuelve la nueva pila. tipo_base ElimPila (struct tipopila *p) { if PilaVacia (p) { cout << "Pila Underflow \n"; exit (1); } return ((*p).elementos[((*p).tope)--]); } Ing. M.Sc. Fulbia Torres ING. MSc.Estructuras FULBIA TORRES Asignatura: de Datos ASIGNATURA: ESTRUCTURAS DE DATOS Barquisimeto 2006 BARQUISIMETO 2005 PILA IMPLEMENTACIÓN ESTÁTICA (Mediante Arreglos) Devuelve el valor del elemento que está apuntado por el tope. tipo_base InfoPila (struct tipopila *p) { if PilaVacia (p) { cout << "Pila Underflow \n"; exit (1); } else return ((*p).elementos[(*p).tope]); } Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006 PILA IMPLEMENTACIÓN ESTÁTICA (Mediante Arreglos) Devuelve el valor verdadero si la pila está vacía y falso en caso contrario. int PilaVacia (struct tipopila *p) { if ( (*p).tope == -1) return 1; else return 0; } Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006 PILA IMPLEMENTACIÓN ESTÁTICA (Mediante Arreglos) Devuelve el valor verdadero si la pila está llena y falso en caso contrario. int PilaLlena (struct tipopila *p) { if ( (*p).tope == MAXELEM) return 1; else return 0; } Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006 PILA IMPLEMENTACIÓN ESTÁTICA (Mediante Arreglos) Destruye la pila retornando toda la memoria ocupada. void DestruirPila (struct tipopila *p) { delete (p); } Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006 Implementar una función que cuente y elimine de la pila todas las ocurrencias del elemento entero val. void EliminaOcurren(struct tipopila *p, int elem) { int val=0, cuenta=0; //declaración variables struct tipopila paux; //pila auxiliar CrearPila(&paux); while (!PilaVacia(p)) { val=ElimPila(p); //crea una pila auxiliar vacía //saca el elemento que está en el tope de la pila //y lo almacena en val if (elem==val) {cuenta++; //cuenta la ocurrencia y queda eliminado cout<< "Eliminando";} else AdicPila(&paux,val); //si no es igual lo agrega a la pila auxiliar } while(!PilaVacia(&paux)) //devuelve a la pila original los elementos de la pila auxiliar { val=ElimPila(&paux); AdicPila(p,val); } cout<< " PILA "; cout << endl; MosElem(p); cout << "\n"; } //muestra los elementos PILA IMPLEMENTACIÓN ESTÁTICA (Mediante Arreglos) CON CLASES DEFINICIÓN # define MAXELEM número máximo de elementos typedef tipo tipo_base; class Pila { private: int tope; tipo_base elementos[MAXELEM]; public: Pila( ) { tope = -1; // condición de pila vacía Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos } Barquisimeto 2006 PILA IMPLEMENTACIÓN ESTÁTICA (Mediante Arreglos) CON CLASES CONTINUACIÓN DEFINICIÓN void Pila :: AdicPila (tipo_base valor); tipo_base Pila :: ElimPila(); tipo_base Pila :: LimpiarPila(); tipo_base Pila :: InfoPila(); bool Pila :: PilaVacia(); bool Pila :: PilaLlena(); //operación Modificadora //operación Modificadora //operación Modificadora //operación Analizadora //operación Analizadora //operación Analizadora } Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006 PILA IMPLEMENTACIÓN ESTÁTICA (Mediante Arreglos) CON CLASES Agrega un elemento a la Pila. void Pila :: AdicPila( tipo_base valor) { if PilaLlena () cout << "Pila Overflow \n”; else elementos[++ tope ] = valor; } Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006 PILA IMPLEMENTACIÓN ESTÁTICA (Mediante Arreglos) CON CLASES Elimina el elemento indicado por el valor del tope. tipo_base Pila :: ElimPila() { if (PilaVacia()) { cout<<"Error: Pila underflow\n"; exit(1); } else return elementos[tope--]; } Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006 PILA IMPLEMENTACIÓN ESTÁTICA (Mediante Arreglos) CON CLASES Pone el tope de la pila a su valor inicial. void Pila :: LimpiarPila() { tope = -1; } Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006 PILA IMPLEMENTACIÓN ESTÁTICA (Mediante Arreglos) CON CLASES Devuelve el valor del elemento que está apuntado por el tope. tipo_base Pila :: InfoPila () { if (PilaVacia()) { cout<<"Error: Pila underflow\n"; exit(1); } else return elementos[tope]; } Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006 PILA IMPLEMENTACIÓN ESTÁTICA (Mediante Arreglos) CON CLASES Devuelve el valor verdadero si la pila está vacía. bool Pila :: PilaVacia () { return tope == -1; } Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006 PILA IMPLEMENTACIÓN ESTÁTICA (Mediante Arreglos) CON CLASES Devuelve el valor verdadero si la pila está vacía. bool Pila :: PilaLlena () { return tope == MAXELEM -1; } Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006 #include <iostream.h> #include <string.h> #include "pilalineal.h" typedef char tipo_base; //Verifica si una palabra es palindromo int main() { pilalineal p; bool espal; char pal[81]; cout << "Teclea la palabra verificar si es palindromo: " << endl; cin.getline(pal,sizeof(pal)); for(int i=0; i<strlen(pal); ) { char c; c = pal[i++]; p.AdicPila(c); } espal = true; for(int j=0; espal && !p.PilaVacia(); ) { char c; c = p.ElimPila(); espal = pal[j++] == c; } p.LimpiarPila(); if (espal) cout << "La palabra " << pal << " es un palindromo" << " \n"; else cout << "La palabra " << pal << " no es un palindromo" << " \n"; return 0; } PILA APLICACIONES Llamadas a subprogramas. Correspondencia de paréntesis. Tratamiento de expresiones aritméticas. Recursividad. Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006 PILA APLICACIONES CORRESPONDENCIA DE PARÉNTESIS Pasos: Se rastrea la cadena de elementos de izquierda a derecha. Cada vez que se encuentre un paréntesis izquierdo se mete en la pila. Cada vez que se encuentre un paréntesis derecho se revisa el contenido de la pila. Si está vacía entonces habremos encontrado un paréntesis derecho que no cierra un paréntesis izquierdo, y hay un error. Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006 PILA APLICACIONES CORRESPONDENCIA DE PARÉNTESIS Si la pila no está vacía se ha encontrado el par y solo se saca de la pila. Si la pila no está vacía al terminar la cadena, entonces hay un paréntesis izquierdo sin cerrar. Hacer Ejercicio Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006 PILA APLICACIONES TRATAMIENTO DE EXPRESIONES ARITMÉTICAS Revisamos algunos conceptos: Dada la expresión A + B se dice que está en notación infija y su nombre se debe a que el operador (+) está entre los operandos (A y B). Dada la expresión AB+ se dice que está en notación postfija y su nombre se debe a que el operador (+) está después de los operandos (A y B). Dada la expresión + AB se dice que está en notación prefija y y su nombre se debe a que el operador (+) está antes de los operandos (A y B). Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006 PILA APLICACIONES TRATAMIENTO DE EXPRESIONES ARITMÉTICAS Para convertir una expresión en notación polaca (post) o (pre), deberán establecerse previamente ciertas condiciones: Solamente se manejaran los siguientes operadores ordenados de mayor a menor según su prioridad de ejecución: $ potencia * / (multiplicación y división) + - (suma, resta) Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006 PILA APLICACIONES TRATAMIENTO DE EXPRESIONES ARITMÉTICAS Continuación: Los operadores de más alta prioridad se ejecutan primero. Si hubiera en una expresión dos o más operadores de igual prioridad, entonces se procesarán de izquierda a derecha, excepto en el caso de la exponenciación, en donde se supone que el orden es de derecha a izquierda. Las subexpresiones parentizadas tedrán más prioridad que cualquier otro operador. Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006 PILA APLICACIONES TRATAMIENTO DE EXPRESIONES ARITMÉTICAS Ejemplo: Convertir de infija a postfija: A+B*C A + BC* ABC*+ (A + B) * C (A + b) * (C - D) A $ B * C - D + E / F / (G + H) (A + B) * (C $ (D - E) + F) - G ((A + B) * C - (D - E)) $ (F + G) infija operando único Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006 PILA APLICACIONES TRATAMIENTO DE EXPRESIONES ARITMÉTICAS Ejemplo: Convertir de infija a prefija: A+B*C A + *BC +A*BC (A + B) * C (A + B) * (C - D) A $ B * C - D + E / F / (G + H) (A + B) * (C $ (D - E) + F) - G ((A + B) * C - (D - E)) $ (F + G) infija operando único Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006 PILA APLICACIONES TRATAMIENTO DE EXPRESIONES ARITMÉTICAS Reglas utilizando pilas (notación infija a postfija): Si el símbolo es un paréntesis que abre “(“ éste se mete en la pila de operadores. Si el símbolo es un paréntesis que cierra “)” se saca de la pila todo lo que exista hasta llegar al primer paréntesis que abra “(“. Los operadores van a la salida, a medida que salen de la pila. El paréntesis que abre “(“ se saca pero no va a la salida. Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006 PILA APLICACIONES TRATAMIENTO DE EXPRESIONES ARITMÉTICAS Continuación: Si el símbolo es un operador, entonces, si el operador en el tope de la pila es de la misma o de mayor precedencia, dicho operador se saca y va a la salida, continuando de esta manera hasta que el primer paréntesis izquierdo o un operador de menor precedencia se encuentre en la pila, Cuando esto ocurre, el operador en turno se mete a la pila. Si el símbolo es un operando, éste se envía directamente a la salida. Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006 PILA APLICACIONES TRATAMIENTO DE EXPRESIONES ARITMÉTICAS Ejemplo: Infijo a postfijo. ((A + B) * C / D + E $ F) / G ( ( ( ( ( + ( ( ( * / ( ( / ( + $ ( + ( / Salida: A B + C * D / E F $ + G / Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006 PILA APLICACIONES EVALUACIÓN DE UNA EXPRESIÓN POSTFIJA Cada operador en una cadena postfija hace referencia a los dos operandos anteriores de la cadena (por supuesto, uno de estos dos operandos puede ser el resultado de aplicar un operador anterior). Cada vez que se lee un operando se agrega a la pila. Cuando se encuentra un operador, sus operandos son los dos elementos superiores en la pila, después se pueden remover estos dos elementos, ejecutar la operación indicada sobre ellos y agregar el resultado a la pila para que esté disponible como operando del operador siguiente. Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006 PILA APLICACIONES EVALUACIÓN DE UNA EXPRESIÓN POSTFIJA Ejemplo: ABC *+ oper1 oper2 B A C B*C pila A A,B A,B,C A,B*C A + (B * C) Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006 PILA APLICACIONES EVALUACIÓN DE UNA EXPRESIÓN POSTFIJA Ejemplo: A=6, B=3, C=1 631*+ símbolo oper1 6 3 1 * 3 + 6 oper2 valor 1 3*1 3 9 pila 6 6,3 6,3,1 6,3*1 6, 3 9 Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006 EVALUACIÓN DE UNA EXPRESIÓN PREFIJA Ejemplo: símbolo * + a b * + ab – cd oper1 oper2 a b d a+b c c d c-d pila * *,+ *, +, a *, +, a, b *, a + b *, a + b, *, a + b, -, c *, a + b, -, c, d *, a + b, -, c - d (a + b) * (c - d) PILA EJERCICIOS PROPUESTOS Capitulo de pilas Ejercicios pag. 85 : 2.1.1 todos, 2.1.3 Ejercicios: pag. 95: 2.2.4, 2.2.8 De infijo a postfijo pag. 115: 2.3.1 todas, 2.3.2 todas, 2.3.3 todas, 2.3.4 Ejercicio 2.3.7, hacerlo también para postfija. Guia de ejercicios Ing. M.Sc. Fulbia Torres ING. MSc.Estructuras FULBIA TORRES Asignatura: de Datos ASIGNATURA: ESTRUCTURAS DE DATOS Barquisimeto 2006 BARQUISIMETO 2005 GRACIAS POR SU ATENCIÓN HASTA LA PRÓXIMA CLASE Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006