Você está na página 1de 6

Programacin.

Tema 4: Pilas y Colas

(16/Mayo/2004)

Apuntes elaborados por: Eduardo Quevedo, Raquel Lpez y Aaron Asencio

Revisado por: Javier Miranda el ????

Tema 4.- Pilas y Colas


Las pilas y colas son estructuras de datos que se utilizan generalmente para simplificar ciertas operaciones de programacin. Estas estructuras pueden implementarse mediante arrays o mediante listas enlazadas.

Pilas:
Las pilas son estructuras de datos que tienes dos operaciones bsicas: push (para insertar un elemento) y pop (para extraer un elemento). Su caracterstica fundamental es que al extraer se obtiene siempre el ltimo elemento que acaba de insertarse. Por esta razn tambin se conocen como estructuras de datos LIFO (del ingls Last In First Out). Una posible implementacin mediante listas enlazadas sera insertando y extrayendo siempre por el principio de la lista. Gracias a las pilas es posible el uso de la recursividad (lo veremos en detalle en el tema siguiente). La variable que llama al mismo procedimiento en el q est, habr que guardarla as como el resto de variables de la nueva llamada, para a la vuelta de la recursividad ir sacandolas, esto es posible a la implementacin de pilas. Las pilas se utilizan en muchas aplicaciones que utilizamos con frecuencia. Por ejemplo, la gestin de ventanas en Windows (cuando cerramos una ventana siempre recuperamos la que tenamos detrs). Otro ejemplo es la evaluacin general de cualquier expresin matemtica para evitar tener que calcular el nmero de variables temporales que hacen falta. Por ejemplo: 3 + 4 * (8 2 * 5) 5 -2 8 4 3 -10 8 4 3

-2 4 3

-8 3

-5

Programacin. Tema 4: Pilas y Colas

(16/Mayo/2004)

Colas:
Las colas tambin son llamadas FIFO (First In First Out), que quiere decir el primero que entra es el primero que sale.

Colas simples: Se inserta por un sitio y se saca por otro, en el caso de la cola simple se inserta por el final y se saca por el principio. Para gestionar este tipo de cola hay que recordar siempre cual es el siguiente elemento que se va a leer y cual es el ltimo elemento que se ha introducido. 910 973 175 137 Colas circulares: En las colas circulares se considera que despus del ltimo elemento se accede de nuevo al primero. De esta forma se reutilizan las posiciones extradas, el final de la cola es a su vez el principio, crendose un circuito cerrado. 4 3 2 1 5 4 3 2 1 5 4 3 2 5 4 3 2 8

Lo que se ha hecho es insertar (5), sacar (1), e insertar (8). Se sabr que una tabla est llena cuando rear y front estn en una posicin de diferencia. El teclado de ordenador se comporta exactamente como una cola circular. Para implementar las colas circulares mediante listas enlazadas se pone en el tipo T_Lista los punteros front y rear.

Programacin. Tema 4: Pilas y Colas

(16/Mayo/2004)

Colas con prioridad: Las colas con prioridad se implementan mediante listas o arrays ordenados. No nos interesa en este caso que salgan en el orden de entrada sino con una prioridad que le asignemos. Puede darse el caso que existan varios elementos con la misma prioridad, en este caso saldr primero aquel que primero llego (FIFO).

Paquete Pila:
Finalmente implementamos el paquete pila tanto para un array como para listas. Esta implementacin ser realmente til para el tema siguiente, recursividad. Array: ADS generic type TDato is private; package Pila_generica is type TPila (Maximo : Positive) is private; Llena, Vacia, FueraDeRango : exception; procedure Push ( Pila : in out TPila; Dato : in TDato ); procedure Pop ( Pila : in out TPila; Dato: out TDato ); function PilaVacia (Pila : in TPila) return Boolean; function PilaLlena (Pila : in TPila) return Boolean; function Valor ( Pila : in TPila; Index : Positive ) return TDato; private type TVector is array (Positive range <>) of TDato; type TPila (Maximo : Positive) is record Contenido : TVector (1 .. Maximo); Cima : Natural := 0; end record; end;

ADB with Text_IO; with Unchecked_Deallocation; use Text_IO; package body Pila_Generica_Dinamica is procedure Free is new Unchecked_Deallocation (TNodo,TPuntero);

Programacin. Tema 4: Pilas y Colas

(16/Mayo/2004)

function Vacia (Pila : in TPila) return Boolean is begin return Pila.Cab = null; end; procedure Push (Pila: in out TPila; Dato: in TDato) is NuevoNodo : TPuntero := new TNodo; begin NuevoNodo.Dato := Dato; NuevoNodo.Sig := Pila.Cab; Pila.Cab := NuevoNodo; Pila.Vacia := False; end; procedure Pop ( Pila : in out TPila; Dato : out TDato) is P : TPuntero; begin if Pila.Vacia = True then raise Vacia; end if; P := Pila.Cab; Pila.Cab := Pila.Cab.Sig; P.Sig := null; Dato := P.Dato; Free(P); if Pila.Cab = null then Pila.Vacia := True; else Pila.Vacia := False; end if; end; procedure Reset (Pila : in out TPila) is P : TPuntero; begin while Pila.Cab /= null loop P := Pila.Cab; Pila.Cab := Pila.Cab.Sig; P.Sig := null; Free (P); end loop; Pila.Vacia := True; end; end;

Programacin. Tema 4: Pilas y Colas

(16/Mayo/2004)

Listas: ADS generic type TDato is private; package Pila_Generica_Dinamica is type TPila is private; Vacia : Exception; function Vacia (Pila : in TPila) return Boolean; procedure Reset (Pila : in out TPila); procedure Push (Pila : in out TPila; Dato : in TDato); procedure Pop (Pila : in out TPila; Dato : out TDato); private Type TNodo; Type TPuntero is access TNodo; Type TNodo is record Dato : TDato; Sig : TPuntero; end record; Type TPila is record Cab : TPuntero; Vacia : Boolean := True; end record; end; ADB with Text_IO; with Unchecked_Deallocation; use Text_IO; package body Pila_Generica_Dinamica is procedure Free is new Unchecked_Deallocation (TNodo,TPuntero); function Vacia (Pila : in TPila) return Boolean is begin return Pila.Cab = null; end;

Programacin. Tema 4: Pilas y Colas

(16/Mayo/2004)

procedure Push (Pila: in out TPila; Dato: in TDato) is NuevoNodo : TPuntero := new TNodo; begin NuevoNodo.Dato := Dato; NuevoNodo.Sig := Pila.Cab; Pila.Cab := NuevoNodo; Pila.Vacia := False; end; procedure Pop ( Pila : in out TPila; Dato : out TDato) is P : TPuntero; begin if Pila.Vacia = True then raise Vacia; end if; P := Pila.Cab; Pila.Cab := Pila.Cab.Sig; P.Sig := null; Dato := P.Dato; Free(P); if Pila.Cab = null then Pila.Vacia := True; else Pila.Vacia := False; end if; end; procedure Reset (Pila : in out TPila) is P : TPuntero; begin while Pila.Cab /= null loop P := Pila.Cab; Pila.Cab := Pila.Cab.Sig; P.Sig := null; Free (P); end loop; Pila.Vacia := True; end; end;

Você também pode gostar