Escolar Documentos
Profissional Documentos
Cultura Documentos
Programacin III
Clase Terica N 4
TAD Pila y TAD Cola.
Objetivos
Al final de la clase los estudiantes sern capaces de:
Especificar el TAD Pila.
Definir e implementar la clase Pila.
Realizar aplicaciones de las Pilas en Programacin.
Conocer las diferentes formas de escribir una expresin.
Especificar el TAD Cola.
Encontrar las diferencias fundamentales entre Pilas y Colas.
Definir una clase cola con listas enlazadas.
Aplicar el TAD Cola para la resolucin de problemas.
Introduccin
La Pila es una estructura de datos que almacena y recupera sus elementos atendiendo a un estricto orden. Las
pilas se utilizan en compiladores, sistemas operativos y programas de aplicaciones. Una aplicacin interesante
es la evaluacin de expresiones algebraicas mediante pilas.
Desarrollo
PILAS.
Una pila (stack) es una lista ordenada de elementos en la que todas las inserciones y supresiones se realizan por
un mismo extremo de la lista. A una pila se le pueden aadir y retirar nuevos nodos nicamente de su parte
superior, la cima de la pila. Por esta razn, se conoce una pila como una estructura de datos LIFO por last-in, firstout, es decir ltimo en entrar primero en salir.
Cuando se dice que la pila est ordenada, se quiere decir que hay un elemento al que se puede acceder primero
(el que est encima de la pila), otro elemento al que se puede acceder en segundo lugar (justo el elemento que
est debajo de la cima), un tercero, etc. No se requiere que las entradas se puedan comparar utilizando el
operador menor que y pueden ser de cualquier tipo.
Se referencia una pila mediante un apuntador al elemento superior de la misma. El miembro de enlace en el
ltimo nodo de la pila se define a NULL, para indicar que se trata de la parte inferior de la pila misma.
Programacin III
pila
NULL
Note que las pilas y las listas enlazadas se representan en forma idntica. La diferencia entre las pilas y las listas
enlazadas es que en una lista enlazada las inserciones y borrados pueden ocurrir en cualquier parte, pero en una
pila nicamente en su parte superior.
Las funciones primarias utilizadas para manipular una pila son Insertar (Push) y Quitar (Pop).
La funcin Push crea un nuevo nodo y lo coloca en la parte superior de la pila (tope).
La funcin Pop sirve ya sea para leer o eliminar un nodo de la parte superior de la pila, liberando la memoria que
fue asignada al nodo retirado, y regresando el valor retirado.
Las pilas se pueden implementar guardando los elementos en un array, pero este debe ser lo suficientemente
amplio para poder contener el mximo previsto de elementos de la pila. Un extremo del array se considera el
fondo de la pila, que permanecer fijo.
La implementacin dinmica de una pila se hace almacenando los elementos como nodos de una lista enlazada,
con la particularidad de que siempre que se quiera meter (empujar) un elemento se har por el mismo extremo
que se extraer. Esta realizacin tiene la ventaja de que el tamao se ajusta exactamente a los elementos de la
pila. Sin embargo, para cada elemento es necesaria ms memoria, ya que hay que guardar el campo de enlace.
Inicia la pila
Pone un dato en la pila
Retira (saca) un dato de la pila
Comprobar si la pila no tiene elementos
Quita todos sus elementos y dejar la pila vaca
Obtiene el elemento cima de la pila
Nmero de elementos mximo que puede contener la pila
______________________________________________________________________________________________________________
UDB Ciclo 02 2015
65
Programacin III
class pila
{ public nodo tope;
public pila()
Definicin de la estructura de la pila.
{ tope = null;
}
public void Push(char valor)
{ nodo aux = new nodo();
aux.info = valor;
if (tope == null)
{ tope = aux;
aux.sgte = null;
}
else
{ /* si la pila no esta vacia el dato se inserta arriba de la pila, es decir en
el tope */
aux.sgte = tope;
tope = aux;
}
}
public char Pop()
{
char valor ='';
if (tope == null)
Console.WriteLine("Lista vacia");
else
{ //se elimina el ultimo en entrar y se retorna el valor que se elimina
valor = tope.info;
tope = tope.sgte;
}
return valor;
}
public void mostrar()
{
nodo puntero;
puntero = tope;
Console.WriteLine("{0}", puntero.info);
______________________________________________________________________________________________________________
UDB Ciclo 02 2015
66
Programacin III
}
Las operaciones Push y Pop acceden a la lista directamente con el puntero tope (apunta al ltimo nodo apilado).
Entonces, como no necesitan recorrer los nodos de la pila, no dependen del nmero de nodos, la eficiencia de
cada operacin es constante, O (1).
Representacin grfica.
El primer recuadro encierra el cdigo de nodo, este cdigo permitir crear cada nodo para implementar la pila.
Cada nodo tendr un valor y un puntero apuntando al siguiente nodo o elemento de la pila.
El segundo recuadro encierra el cdigo de la Pila, este cdigo permitir crear la pila dentro de la cual se colocar
cada nodo.
pila
tope
Representacin grfica.
pila
tope
NULL
1
______________________________________________________________________________________________________________
UDB Ciclo 02 2015
67
Programacin III
1. El constructor inicializa el fondo de la pila, poniendo a tope (puntero de la pila) apuntado a NULL.
Ahora ya est creada la pila.
Anlisis de Funcin Push (Insertar nuevo nodo a la Pila en el tope)
public void Push(char valor)
{ nodo aux = new nodo();
aux.info = valor;
(1)
if (tope == null)
{ tope = aux; (2)
aux.sgte = null;
}
else
{ /* si la pila no esta vacia el dato se inserta arriba de la pila, es decir en
el tope */
aux.sgte = tope;
tope = aux;
}
}
(1) Para las pilas slo se pueden insertar elementos al tope, por lo tanto lo nico que hacemos es crear el
nuevo nodo pasando como parmetro el valor a guardar y pasndole el valor al que apunta en ese
momento tope, como tope antes de agregar el nodo apunta a NULL entonces "sgte" apuntar a NULL.
(2) Le indicamos a tope (puntero de la pila) que apunte al nodo que se acaba de agregar.
Representacin grfica.
Pila
to pe
(1)
(2)
sgte
valor
NULL
Nuevo nodo
Programacin III
Console.WriteLine("Lista vacia");
else
{ //se elimina el ultimo en entrar y se retorna el valor que se elimina
valor = tope.info; (3)
tope = tope.sgte;
} (4)
return valor; (5)
}
Pila
tope
(3)
Pila
valor = a (tope.info)
t o pe
(4)
Dato a
to pe
sgte
Dato a
Dato b
sgte
sgte
Dato b
NULL
sgte
NULL
Anlisis de Funcin mostrar (Para mostrar el contenido de la pila, es decir, los datos de los nodos).
public void mostrar()
{
nodo puntero; (1)
puntero = tope;
Console.WriteLine("{0}", puntero.info);(2)
//se recorre el puntero del tope hasta el fondo
while (puntero.sgte != null) (3)
{
puntero = puntero.sgte;
Console.WriteLine("{0}", puntero.info);
(4) y (5)
}
______________________________________________________________________________________________________________
UDB Ciclo 02 2015
69
Programacin III
}
}
Interpretacin.
(1) Se crea una referencia del tipo nodo llamado puntero, el cual se iguala al valor de tope (puntero de pila)
para colocarse al inicio de la pila.
(2) Muestra el contenido de la pila.
(3) Para imprimir los elementos de la pila entra en el lazo while mientras puntero.sgte (puntero al inicio de
la pila) sea distinto de NULL, es decir mientras no se llegue al fondo (ltimo elemento de la pila) de la
pila.
(4) Hace que puntero apunte al valor del nodo y lo imprime.
(5) Hace que puntero se mueva al siguiente elemento de la pila y continua en el lazo while hasta que
puntero.sgte llegue al final de la pila.
Esto ms o menos se vera as: Suponga que tiene una pila de la siguiente forma:
Pila
Pila
puntero
NULL
Programacin III
mipila.Push('b');
mipila.Push('z');
mipila.Push('s');
//mostramos el contenido de la pila
mipila.mostrar();
Console.ReadLine();
//sacamos un elemento de la pila
mipila.Pop();
mipila.mostrar();
Console.ReadLine();
//PARTE 2
//SE INGRESA UNA CADENA Y SE INGRESAN TODOS LOS CARACTERES DE DICHA CADENA
Console.WriteLine("\t\t---PARTE II---");
Console.Write("Ingrese la palabra: ");
cadena = Console.ReadLine();
for (int i = 0; i < cadena.Length; i++)
{
//extrae una caracter de la cadena y lo convierte en char
caracter = char.Parse(cadena.Substring(i, 1));
pilafrase.Push(caracter);
}
//imprimir el contenido de la pila
pilafrase.mostrar();
Console.ReadLine();
}
OPERADOR
PRIORIDAD
Parntesis
()
Potencia
2 Nivel de prioridad
______________________________________________________________________________________________________________
UDB Ciclo 02 2015
71
Programacin III
Multiplicacin/Divisin
*,/
Suma/Resta
+, 4 Nivel de prioridad
Tambin suponemos que a igualdad de precedencia, los operadores son evaluados de izquierda a derecha
(asociatividad), excepto la potencia que es de derecha a izquierda.
Programacin III
Tiene igual prioridad que el operador cima de la pila y se trata de la mxima prioridad.
Si la prioridad es menor o igual se saca el elemento cima de la pila, se pone en la expresin postfija y se vuelve a
hacer la comparacin con el nuevo elemento cima.
Los parntesis izquierdos siempre se meten en la pila con la mnima prioridad para que todo operador que se
encuentra dentro del parntesis entre en la pila. Cuando se lee un parntesis derecho, hay que sacar todos los
operadores de la pila pasando a formar parte de la expresin postfija, hasta llegar a un parntesis izquierdo, el
cual se elimina, ya que los parntesis no forman parte de la expresin postfija.
El algoritmo termina cuado no hay ms tems de la expresin origen y la pila est vaca.
Sea por ejemplo la expresin infija A*(B+C - (D / E^F)-G) - H, la expresin en postfija se va ir formando con la
siguiente secuencia:
Expresin
Estado de la Pila
AB
ABC
+
(
*
El nuevo carcter ledo es -, que tiene igual prioridad que el elemento cima de la pila +; en consecuencia, el
estado de la pila es:
(
*
Y la expresin es:
Expresin
Estado de la Pila
ABC+
ABC+D
ABC+DE
ABC+DEF
______________________________________________________________________________________________________________
UDB Ciclo 02 2015
73
Programacin III
^
/
(
(
*
(
*
Y la expresin:
Expresin
Estado de la Pila
ABC+DEF^/
ABC+DEF^/-
ABC+DEF^/-G
Expresin
Estado de la Pila
ABC+DEF^/-G-*
ABC+DEF^/-G-*H
ABC+DEF^/-G-*H-
En la descripcin realizada se observa que el parntesis izquierdo tiene la mxima prioridad fuera de la pila, es
decir, en la notacin infija; sin embargo, cuando est dentro de la pila la prioridad es mnima. De igual forma,
para tratar el hecho de que varios operadores de potenciacin son evaluados de derecha a izquierda, este
operador tendr mayor prioridad cuando todava no est metido en la pila que el mismo pero metido en la pila.
______________________________________________________________________________________________________________
UDB Ciclo 02 2015
74
Programacin III
El TAD COLA.
El TAD cola es una estructura muy utilizada en la vida cotidiana, y tambin para resolver problemas en
programacin. Al igual que las Pilas, almacena y recupera sus elementos atendiendo un estricto orden. Las colas
se conocen como estructuras FIFO (First In, First Out, primero en entrar primero en salir), debido a la forma y
orden de insercin y de extraccin de elementos de la Cola.
Las colas tienen numerosas aplicaciones en el mundo de la computacin: colas de mensajes, colas de tareas a
realizar por una impresora, colas de prioridades.
Colas.
Una cola es una estructura de datos que almacena elementos en una lista lineal y el acceso a los datos se hace
por uno de los dos extremos de la lista. Un elemento se inserta en la cola (parte final) de la lista y se suprime o
elimina por el frente (parte inicial, frente) de la lista. Las aplicaciones utilizan una cola para almacenar elementos
en su orden de aparicin o concurrencia.
Las colas se llaman tambin FIFO (firt-in, first-out), ya que el primer elemento que llega a la cola ser el primero
que salga de ella. En informtica, una cola tpica es una cola de prioridad: programas con diferente prioridad
forman una cola mientras esperan a ser ejecutados.
La representacin grfica de una cola es:
Eliminacin
Insercin
Frente
Final
______________________________________________________________________________________________________________
UDB Ciclo 02 2015
75
Programacin III
Desde el punto de vista de estructura de datos, una cola es similar a una pila, en cuanto que los datos se
almacenan de modo lineal y el acceso a los datos slo est permitido en los extremos de la cola.
De manera general las colas funcionan as:
Anlisis de las Funciones para definir el Nodo y la Cola.
class nodo
(1)
(1) Se define la clase nodo para crear los nodos (elementos de la cola).
(2) Los miembros pblicos de la clase.
(3) En la ltima lnea creamos un enlace llamado sgte que nos permitir crear enlaces del mismo tipo de las
variables a las cuales apuntar, es decir a los nodos.
Representacin Grfica de la Clase Nodo:
nodo
sgte
info
NULL
______________________________________________________________________________________________________________
UDB Ciclo 02 2015
76
Programacin III
public Cola()
(2)
{ inicio = null;
final = null;
}
}
cola
inicio final
NULL
Anlisis de la Funcin Aadir.
public void Aadir(int valor)
{ nodo aux = new nodo();
(2)
aux.info = valor;
(1)
if (inicio == null)
{ inicio = aux; (5)
final = aux; (4)
aux.sgte = null;
}
else
{ final.sgte = aux;
aux.sgte = null;
final = aux; (4)
}
}
(3)
______________________________________________________________________________________________________________
UDB Ciclo 02 2015
77
Programacin III
(3) El else de la lnea 3 considera el hecho que la cola no est vaca. Y como el nodo que contiene el valor b
es el ltimo, entonces hace que final apuntando a siguiente sea igual al nuevo nodo.
(4) Y hace que final (puntero de la cola) sea igual al nuevo nodo (que apunte a l).
(3) El programa no entrar a esta lnea 3 porque estamos considerando que nuestra cola est vaca.
(4) Hace que final (puntero de la cola) sea igual al nuevo nodo (que apunte a l).
(5) Como la cola est vaca entra en este if y hace que tambin inicio (puntero de la cola) sea igual al nuevo
nodo.
______________________________________________________________________________________________________________
UDB Ciclo 02 2015
78
Programacin III
(1) Si la cola est vaca retorna el mensaje Cola vaca y termina la funcin.
(2) Si la cola no est vaca avanza hasta esta lnea y hace que inicio (puntero de la cola) sea igual a inicio
apuntando a siguiente (recuerde que necesito guardar el enlace).
(1)
if (inicio == null)
Console.WriteLine("Cola vaca");
else (2)
{ valor = inicio.info; (3)
inicio = inicio.sgte;
}
return valor;
(5)
Representacin Grfica.
(1) Si la cola est vaca retorna el mensaje Cola vaca y termina la funcin.
(2) Si la cola no est vaca avanza hasta esta lnea y hace que inicio (puntero de la cola) sea igual a inicio
apuntando a siguiente (recuerde que necesito guardar el enlace).
(3) Luego asigno a la variable valor el dato que guarda el nodo a eliminar.
(4) Elimino el nodo.
(5) Retornamos el valor que guardamos en la variable v.
______________________________________________________________________________________________________________
UDB Ciclo 02 2015
79
Programacin III
Programacin III
Representacin Grfica.
(1) Se verifica si la cola est vaca. Si inicio es igual a NULL, significa que la cola est vaca y devolver el
mensaje Cola vaca.
(2) Si la cola no est vaca, se declara puntero.
(3) Se hace que puntero apunte a primero de la cola.
(4) Mientras puntero no sea igual a NULL (final de la cola) se imprime el valor que tiene el nodo. Luego
hacemos que puntero avance por cada nodo. Cuando se recorre toda la cola y se llega al final de la misma
(puntero = NULL) se termina el bucle.
______________________________________________________________________________________________________________
UDB Ciclo 02 2015
81