INSTITUTO POLITECNICO NACIONAL. ESCUELA SUPEIRIOR DE INGENIERIA MECANICA Y ELECTRICA. UNIDAD CULHUACAN. INTEGRANTES: FLORES ACOLTZI ONESIMO MARCEL SANTOS ARIEL MARTINEZ AGUILAR GILBERTO. MATERIA: ESTRUCTURA Y BASE DE DATOS. PROFESOR: ING. JESUS RODRIGUEZ BUENDIA. GRUPO: 3EM1.
OBJETIVO DEL PROYECTO Realizaremos un programa el cual utiliza la información básica sobre las pilas, este programa consistirá en una tipo agenda, la cual pide el nombre, teléfono y edad de una persona. Una vez almacenada esta información de una persona, se puede volver a introducir otra y el programa lo pondrá hasta arriba, si el usuario decide borrar lo que hay en esa pila (a esa persona) la que fue introducida primero aun estará ahí, si el usuario decide volver a tomar la opción de borrar, se eliminara a la persona que se ingreso primero y se mostrara un mensaje de pila vacia, INTRODUCCION Las estructuras dinámicas son colecciones de elementos con un tamaño que puede variar cuando se ejecuta el programa (en tiempo de ejecución del programa). Las colas y las pilas entran dentro de la clasificación de estructuras dinámicas. En la codificación de estas estructuras dinámicas hay que separar dos conceptos: 1. El mecanismo con el que se insertan /extraen los elementos de la estructura dinámica (que determinara el que sea pila o cola). 2. El soporte o mecanismo físico en el que esta implementada la estructura dinámica (este soporte puede ser una tabla unidimensional o multidimensional, una lista,). Por lo tanto, es importante destacar que cuando se define una estructura dinámica de este tipo (pila o cola) se esta especificando como se accede a los datos, pero no como se gestionan internamente. PILAS Las pilas son estructuras dinámicas que tienen una disciplina de extracción/inserción específica. Esta disciplina se conoce como LIFO (Last In, First Out). Con una disciplina de gestión de este tipo el elemento mas reciente almacenado es el primero en ser recuperado. Para poder trabajar con una pila será necesario realizar las dos operaciones citadas anteriormente (extracción e inserción) con la disciplina especificada (LIFO). Estas operaciones se van a realizar con funciones.
FUNCIONES ASOCIADAS A LAS PILAS. Las funciones necesarias para poder trabajar con una pila están vinculadas con las operaciones relacionadas con la disciplina de pila. Estas funciones son: push: Inserta o almacena un elemento en el soporte o mecanismo físico en el que esta implementada la pila. pop: Recupera o extrae un elemento del soporte o mecanismo físico en el que esta implementada la pila. El elemento mas recientemente almacenado se dice que esta en la cima de la pila. Si se extrae este elemento, desaparece de la pila, por lo que se dice que es una operación destructiva, disminuyendo el valor de la cima de la pila. Si se inserta un elemento el valor de la cima de la pila se deberá incrementar. En la siguiente figura aparecen las funciones push y pop, y la posición de la cima. Cuando se inserta un elemento con la función push se coloca en la encima de los elementos que existen en la pila (si los hubiere). Cuando se extrae un elemento con la función pop se saca de la cima de los elementos de la pila (si existe un elemento por extraer). Un ejemplo de funcionamiento de la pila aparece en la siguiente tabla:
OPERACIÓN CONTENIDO DE LA PILA ELEMENTO EXTRAIDO push(a) A push (B) AB Pop() A B push (C) AC push (D) ACD pop() AC D pop() A C pop() A SOPORTE PARA LA IMPLEMENTACION DE UNA PILA Como ya se ha comentado en este trabajo, las pilas se pueden gestionar internamente de distintas formas, siempre y cuando se mantengan las funciones que implementen las disciplinas de acceso. Los soportes mas usados son las listas enlazadas y la zona de memoria con posiciones contiguas. USO DE LISTAS Cuando se utilizan las listas enlazadas como soporte para la implementación de una pila, la función de inserción de un elemento (push) debe realizar las siguientes tareas: Crear un nodo. Insertarlo en la primera posición.
La función de extracción de un elemento (pop) deberá realizar las siguientes tareas: Extraer el primer elemento de la lista Borrarlo. USO DE TABLAS. Cuando se utiliza una tabla como soporte para la implementación de una pila, se intentara aprovechar las ventajas del uso de una tabla: la rapidez de acceso a los elementos mediante el uso de índices. Estos índices se utilizan para representar dos posiciones: La primera posición, base, indicara el comienzo de la zona reservada. Este índice representa una posición de valor fijo. Un índice variable que es la cima de la pila e indica la siguiente posición libre. Este índice se modifica al almacenar o recuperar un elemento. Habrá que fijarnos que la pila estará vacía si el valor de base es el mismo que el de la cima. La modificación de estos índices en una tabla cuando se utilizan las funciones pop y push se muestran en la siguiente figura: Aunque una pila debería tener un tamaño indefinido, en la mayor parte de las implementaciones es factible la utilización de tablas con un tamaño máximo, que se denomina dimensión.
Esto puede provocar que la pila se llene. Sabremos que la pila esta llena cuando se cumpla: (base + dimensión) == cima En esta situación, no se puede insertar ningún elemento nuevo si no se extrae uno antes. Las soluciones a este problema dependerán del uso que se le este dando a la pila. APLICACIONES DE PILAS. El uso de las pilas esta ampliamente extendido en aplicaciones relacionadas con compiladores y sistemas operativos. También se utiliza en cualquier entorno en el que se utilice la disciplina LIFO, es decir, en situaciones donde siempre hay que recuperar el último valor que se almaceno. EJERCICIO CON TABLAS Se pretende realizar un programa de una calculadora con la notación polaca inversa (RPN) en lugar de la infija. La calculadora debe aceptar los operadores de suma, resta multiplicación y división (+, -, * y /) y soló manejará operandos de tipo entero. En la notación RPN, cada operador sigue sus operandos; a una expresión infija como (7-3) * (2+1) Se introduce en la notación RPN como: 7 3 2 1 + * La ventaja de este tipo de notación es que hace innecesaria la utilización de parentesís. La notación no es ambigua mientras se sepa cuántos operandos espera cada operador.
El programa usará una pila para almacenar los operandos, y se realiza de la siguiente forma: La estructura del programa en un bucle que va leyendo hasta que se introduce el caractér f` para terminar el bucle, y realiza las operaciones adecuadas para cada operando u operador. Cuando se lee un operando se introduce en la pila. Cuando se lee un operador, se extraen dos operandos (puesto que todos los operadores son binarios), se aplica el operador y el resultado se vuelve a introducir en la pila. Los elementos se van almacenado en una tabla de enteros de tamaño MAXELE (es una constante que vale 10) de nombre pila. Se empieza a llenar por el primer elemento (posición 0 de la tabla). La variable cima es de tipo int y contiene el índice dentro de la tabla donde se puede almacenar el próximo elemento. El índice del último elemento almacenado será cima - 1, y el valor inicial de cima será 0. ORGANIZACIÓN EN FICHEROS El programa principal esta en el fichero calc.c. Las funciones de manejo de la pila están en el fichero pila.c. Las declaraciones de las funciones de manejo de la pila están en el fichero pila.h. En cogeop.c está la función coge_op, que lee y analiza un elemento de la entrada y usa las funciones de la biblioteca estándar isspace e isdigit que están en <ctype.h>. En pila.c está declarada la tabla pila (como variable static) y el índice cima (también como static), para que sólo puedan acceder a ellas las funciones de manejo de la pila (las funciones que están en este fichero). Nótese que estas variables no tienen un almacenamiento global o externo. La siguente figura recoge la organización de los ficheros que componen el programa:
ACLARACIONES SOBRE EL PROGRAMA PRINCIPAL Al analizar un valor de entrada mediante la función coge_op, éste puede corresponder a una de las siguientes categorias: Un número: es un operando. La función devuelve el caractér 0` y el valor estará en la variable numero (se le pasa la dirección). Este valor se almacena en la pila si no esta llena. Un operador: indica una operación. La función devuelve el caractér correspondiente a esa operación. En este caso se recuperan dos operandos de la pila. Si se han podido extraer los dos operandos, el resultado de la operación entre estos operandos se vuelve a almacenar en la pila. En el caso de la división, se comprueba previamente que no haya división por cero. Nueva línea: es el fin de la línea. La función devuelve el caractér \n`(nueva linea). Se recupera un elemento de la pila (si no esta vacía) y se imprime como resultado. Se vuelve a lamacenar en la pila para poder continuar realizando operaciones con datos en la siguiente línea. Fin de entrada. Significa que se ha acabado la entrada. La función devuelve el valor f`. En este caso el programa debe terminar. Otro: Significa que no es ninguno de los anteriores. La función devuelve el caractér leído. La recuperación de los elementos de la pila y la aplicación del operador se hace en la sentencia de control switch, que está dentro de un bucle. La condición de salida del bucle es que se acabe la entrada.
DESARROLLO DEL PROYECTO A continuación se mostrará el desarrollo y compilación del proyecto #include<iostream.h> #include<conio.h> #include<iomanip.h> class persona char nom[80]; int edad; long tel; public: persona(); void pedir(); void mostrar(); ; persona::persona() nom[0]='\0'; edad=0; tel=0; void persona::pedir()
clrscr(); cout<<"nombre: ";cin>>nom; cout<<"telefono: ";cin>>tel; cout<<"edad: ";cin>>edad; void persona::mostrar() cout<<"nombre: "<<nom; cout<<" cout<<" telefono: "<<tel; edad: "<<edad; class pila int i; persona a[5]; public: void insertar();
void sacar(); void mostrar(); pila():i(0) ; void pila::insertar() clrscr(); if(i==5) cout<<"pila llena.."; getch(); return; a[i].pedir(); i++; mostrar(); void pila::sacar() if(i==0)
clrscr(); cout<<"pila vacia" ; getch(); return; i--; mostrar(); void pila::mostrar() int y=30,x=1; clrscr(); if(i==0) cout<<"pila vacia.."; getch(); return; for(int j=i-1;j>=0;j--) gotoxy(x,y++);
a[j].mostrar(); getch(); void main() pila z; int s; do clrscr(); gotoxy(20,10); cout<<" MENU "; gotoxy(20,12); cout<<" 1. INSERTAR.."; gotoxy(20,13); cout<<" 2. ELIMINAR.."; gotoxy(20,14); cout<<" 3. MOSTRAR.."; gotoxy(20,15); cout<<" 4. SALIR.."; s=getch(); switch(s)
case '1': z.insertar(); break; case '2': z.sacar(); break; case '3': z.mostrar(); break; while(s!='4'); VISUALIZACION DEL PROGRAMA Menu
Opción 1
Opción 2 Opción 3