/* TAD PILA DINÁMICA Y APLICACIÓN AUTOR: Edgardo Adrián Franco Martínez (C) Febrero 2011 VERSIÓN: 1.

2 DESCRIPCIÓN: TAD pila o stack. Estructura de datos en la que se cumple: Los elementos se añaden y se remueven por un solo extremo. Este extremo es llamado tope de la pila. El MAIN() incluye un ejemplo de la aplicación de la pila, el cuál resuelve el problema de la evaluacione de los parentesis escritos de manera correcta en una expresión. OBSERVACIONES: Hablamos de una Estructura de datos estática cuando se le asigna una cantidad fija de memoria para esa estructura antes de la ejecución del programa. COMPILACIÓN: gcc TADPilaEstConMain.c -o TADPilaEstConMain EJECUCIÓN: TADPilaEstConMain.exe (En Windows) - ./TADPilaEstConMain (En Linux) */ //LIBRERAS #include <stdio.h> #include <stdlib.h> //DEFINICIONES DE CONSTANTES #define MAX_ELEMENT 100 #define TRUE 1 #define FALSE 0 //DEFINICIONES DE TIPOS DE DATO //Definir un boolean (Se modela con un "char") typedef unsigned char boolean; //Definir un elemento (Se modela con una estructura "elemento") typedef struct elemento { //Variables de la estructura "elemento" (El usuario puede modificar) char c; //*** //*** //*** }elemento; //Definir una pila (Se modela con una estructura que unicamente incluye un punte ro a "elemento") typedef struct pila { elemento arreglo[MAX_ELEMENT]; //La pila es un arreglo estático d e MAX_ELEMET int tope; //El top e es un entero (Indice del arreglo de elementos) }pila; //DECLARACIÓN DE FUNCIONES void Initialize(pila *s); pila para su uso) void Push(pila *s, elemento e); //Inicializar pila (Iniciar una //Empilar (Introducir un elemento a la p

int i. //Leer cadena a evaluar sus parentesis scanf("%s". (a+b)*c(a-c if(Empy(&mi_pila)==FALSE) . exit(1). ro de elementos en la pila) void Destroy(pila *s). Push(&mi_pila. (a+b)*c) if(Empy(&mi_pila)==TRUE) { printf("ERROR: Existen mas parentesis qu e cierran de los que abren").ila) elemento Pop (pila *s). //Desempilar (Extraer un element //Vacia (Preguntar si la pila es //Tope (Obtener el "elemento" de //Tamaño de la pila (Obtener el núme //Elimina pila (Borra a todos lo //Recorrer cada caracter de la cadena for(i=0.g.c='('. } e1=Pop(&mi_pila).i++) { //Si el caracter es ( introducirlo a la pila if(cadena[i]=='(') { e1.j.g. } //Si el caracter es ) realizar un Pop a la pila else if(cadena[i]==')') { //Si se intenta extraer un elemento y la pila es vacia Error: P. //Inicialización de "mi_pila" Initialize(&mi_pila).e1). //Declaro un elemento "e1" elemento e1. //Medir el tamaño de la cadena tam_cadena=strlen(cadena). } } //Si al terminar de revisar la expresión aún hay elementos en la pila Error: P. char cadena[100]. ta vacia) elemento Top(pila *s).cadena).i<tam_cadena. o de la pila) boolean Empy(pila *s). s elementos y a la pila de memoria) //PROGRAMA PRINCIPAL int main(void) { int tam_cadena. l tope de la pila si extraerlo de la pila) int Value_Top(pila *s). //Se declara una pila "mi_pila" pila mi_pila.

Descripción: Empilar (Introducir un elemento a la pila) Recibe: int *s (Referencia a la pila "s" a operar). //Destruir los elementos de la pila Destroy(&mi_pila). } //DEFINICIÓN DE FUNCIONES /* void Initialize(pila *s). } /* void Push(pila *s. s ya ha sido inicializada. s ya ha sido inicializada. elemento e). } //Si la ejecución termina de manera correcta printf("Expresión correcta"). Ademas no se valida el indice del arreglo (tope) esta fuera del arreglo es decir hay desbordamiento y se causará en error. return. */ void Push(pila *s. Descripción: Inicializar pila (Iniciar una pila para su uso) Recibe: int *s (Referencia a la pila "s" a operar) Devuelve: Observaciones: El usuario a creado una pila y s tiene la referencia a ella. return. elemento e (Elemento a intro ducir en la pila) Devuelve: Observaciones: El usuario a creado una pila y s tiene la referencia a ella. exit(1). si esto no ha pasado se ocasionara un error. */ void Initialize(pila *s) { s->tope=-1. elemento e) { s->tope++. exit(0). s->arreglo[s->tope]=e. Descripción: Desempilar (Extraer un elemento de la pila) Recibe: int *s (Referencia a la pila "s" a operar) Devuelve: elemento (Elemento e extraido de la pila) Observaciones: El usuario a creado una pila y s tiene la referencia a ella. } /* void Pop(pila *s).{ printf("ERROR: Existen mas parentesis que abren de los que cierr an"). Ademas no se valida si la pila esta vacia (tope == -1) antes de desempilar (caus a error desempilar si esta esta vacía) */ elemento Pop (pila *s) .

{ return s->arreglo[s->tope--]. } . . */ elemento Top(pila *s) { return s->arreglo[s->tope].. s ya ha sido inicializada. */ boolean Empy(pila *s) { if(s->tope==-1) return TRUE. s ya ha sido inicializada. } /* elemento Top(pila *s). */ int Value_Top(pila *s) { return s->tope. } /* boolean Empy(pila *s). s ya ha sido inicializada. 0->1 elemento. 1->2 elementos. Ademas no se valida si la pila esta vacia antes de consultar al elemento del top e (causa error si esta esta vacía). Descripción: //Vacia (Preguntar si la pila esta vacia) Recibe: int *s (Referencia a la pila "s" a operar) Devuelve: boolean (TRUE o FALSE según sea el caso) Observaciones: El usuario a creado una pila y s tiene la referencia a ella. } /* elemento Top(pila *s).) Observaciones: El usuario a creado una pila y s tiene la referencia a ella.. } /* void Destroy(pila *s). Descripción: Elimina pila (Borra a todos los elementos en a la pila de memoria) Recibe: int *s (Referencia a la pila "s" a operar) Devuelve: Observaciones: El usuario a creado una pila y s tiene la referencia a ella. Descripción: Tamaño de la pila (Obtener el número de elementos en la pila) Recibe: int *s (Referencia a la pila "s" a operar) Devuelve: int (Tamaño de la pila -1->Vacia. Descripción: Tope (Obtener el "elemento" del tope de la pila si extraerlo de la pi la) Recibe: int *s (Referencia a la pila "s" a operar) Devuelve: elemento (Elemento del tope de la pila) Observaciones: El usuario a creado una pila y s tiene la referencia a ella. else return FALSE. */ void Destroy(pila *s) { Initialize(s).

Sign up to vote on this title
UsefulNot useful