Escolar Documentos
Profissional Documentos
Cultura Documentos
Pgina:
76
Sesin
P i l a s
I OBJETIVOS
. . . . Utilizar la estructura de una pila en la solucin de problemas. Representar la estructura de una pila en memoria. Conversin de algoritmos para representar y efectuar operaciones con pilas. Empleo de sentencia y comandos de un lenguaje de programacin en la resolucin de ejercicios propuestos.
II SUMARIO
Definicin de pila. Declaraciones de tipos para manejar pilas en C. Operaciones bsicas con pilas. Push, insertar elemento. Pop, leer y eliminar un elemento.
III DESARROLLO
Definicin
Una pila es un tipo especial de lista abierta en la que slo se pueden insertar y eliminar nodos en uno de los extremos de la lista. Estas operaciones se conocen como "push" y "pop", respectivamente "empujar" y "tirar". Adems, las escrituras de datos siempre son inserciones de nodos, y las lecturas siempre eliminan el nodo ledo. Estas caractersticas implican un comportamiento de lista LIFO (Last In First Out), el ltimo en entrar es el primero en salir.
Ing. Karim Guevara Puente de la Vega Ing. Alvaro Fernndez Del Carpio
Sesin VII
Pgina:
77
El smil del que deriva el nombre de la estructura es una pila de platos. Slo es posible aadir platos en la parte superior de la pila, y slo pueden tomarse del mismo extremo. El nodo tpico para construir pilas es el mismo que vimos en el captulo anterior para la construccin de listas: class CNodo { private: int dato; CNodo *siguiente; };
CNodo es el tipo para declarar nodos, evidentemente. CPila es el tipo para declarar pilas.
Es evidente, a la vista del grfico, que una pila es una lista enlazada. As que sigue siendo muy importante que nuestro programa nunca pierda el valor del puntero al primer elemento, igual que pasa con las listas enlazadas. Teniendo en cuenta que las inserciones y borrados en una pila se hacen siempre en un extremo, lo que consideramos como el primer elemento de la lista es en realidad el ltimo elemento de la pila.
Ing. Karim Guevara Puente de la Vega Ing. Alvaro Fernndez Del Carpio
Sesin VII
Pgina:
78
El proceso es muy simple, bastar con que: 1. nodo->siguiente apunte a NULL. 2. Pila apunte a nodo.
El proceso sigue siendo muy sencillo: 1. Hacemos que nodo->siguiente apunte a Pila. 2. Hacemos que Pila apunte a nodo.
Pgina:
79
1. Hacemos que nodo apunte al primer elemento de la pila, es decir a Pila. 2. Asignamos a Pila la direccin del segundo nodo de la pila: Pila->siguiente. 3. Guardamos el contenido del nodo para devolverlo como retorno, recuerda que la operacin pop equivale a leer y borrar. 4. Liberamos la memoria asignada al primer nodo, el que queremos eliminar.
Si la pila slo tiene un nodo, el proceso sigue siendo vlido, ya que el valor de Pila>siguiente es NULL, y despus de eliminar el ltimo nodo la pila quedar vaca, y el valor de Pila ser NULL.
Ejemplo de pila en C
Supongamos que queremos construir una pila para almacenar nmeros enteros. Haremos pruebas intercalando varios "push" y "pop", y comprobando el resultado. Algoritmo de la funcin "push": 1. Creamos un nodo para el valor que colocaremos en la pila. 2. Hacemos que nodo->siguiente apunte a Pila. 3. Hacemos que Pila apunte a nodo.
void Push(Pila pila, int v) { pNodo nuevo; /* Crear un nodo nuevo */ nuevo = (pNodo)malloc(sizeof(tipoNodo)); nuevo->valor = v; /* Aadimos la pila a continuacin del nuevo nodo */ nuevo->siguiente = pila; /* Ahora, el comienzo de nuestra pila es en nuevo nodo */ pila = nuevo; }
Algoritmo de la funcin "pop": 1. Hacemos que nodo apunte al primer elemento de la pila, es decir a Pila. 2. Asignamos a Pila la direccin del segundo nodo de la pila: Pila->siguiente.
Ing. Karim Guevara Puente de la Vega Ing. Alvaro Fernndez Del Carpio
Sesin VII
Pgina:
80
3. Guardamos el contenido del nodo para devolverlo como retorno, recuerda que la operacin pop equivale a leer y borrar. 4. Liberamos la memoria asignada al primer nodo, el que queremos eliminar.
int Pop(Pila pila) { pNodo nodo; /* variable auxiliar para manipular nodo */ int v; /* variable auxiliar para retorno */ /* Nodo apunta al primer nodo = pila; if(!nodo) return 0; /*Si /* Asignamos a pila toda pila = nodo->siguiente; /* Guardamos el valor de v = nodo->valor; /* Borrar el nodo */ free(nodo); return v; } elemento de la pila */ no hay nodos en la pila retornamos 0*/ la pila menos el primer elemento */ retorno */
IV EJERCICIOS
Para todos los ejercicios se debe de realizar asignacin dinmica de memoria, y adems de utilizar pilas (la cantidad es de acuerdo al diseo de la solucin de cada uno de los estudiantes). 01. Escriba un programa que implemente por medio de clases las operaciones bsicas de una pila que almacene nombres de ciudades. 02. Escribir un programa que d la solucin al problema de las Torres de Hanoi para N discos, utilizando pilas, las cuales representen cada uno de los postes. 03. Escribir un subprograma POLACA(Q, P) que transforme una expresin infija Q en su equivalente expresin postfija P. Asuma que cada operando es un simple carcter alfabtico, usando los smbolos normales para la suma (+), la resta (-), el producto (*) y la divisin (/), pero usando el smbolo S para la potencia.
Ing. Karim Guevara Puente de la Vega Ing. Alvaro Fernndez Del Carpio
Sesin VII