Pilas y Colas

        Pilas
En estas estructuras de datos, el acceso está limitado al elemento más recientemente
insertado.
Operaciones
Todas las operaciones naturales de una pila pueden ser ejecutadas en tiempo de O(1).
Apilar (push)
Inserta un elemento en la cima de la pila.
Desapilar (pop)
Elimina la posición en la cima de la pila y devuelve el objeto que contiene.
Cima (top)
Devuelve el elemento que hay en la cima de la pila sin eliminarlo.


                                            Colas
En estas estructuras de datos, el acceso está limitado al elemento más antiguamente
insertado.
Operaciones
Todas las operaciones naturales de una cola pueden ser ejecutadas en tiempo de O(1).
Encolar (enqueue)
Inserta un elemento al final de la cola.
Desencolar (dequeue)
Elimina la posición en el frente de la cola y devuelve el objeto que contiene.
 Ver (peek)
Devuelve el elemento que hay en el frente de la cola sin eliminarlo.
Colas dobles
Es una estructura similar a una cola, excepto que está permitido el acceso por ambos
extremos. Así como en las listas, para restaurar las referencias con complejidad
constante luego de una eliminación al final, una posición no podrá tener solamente una
referencia al siguiente, sino también al anterior.
Pilas:
Una pila es una estructura de datos a la cual se puede acceder solo por un extremo de la
misma. Las operaciones de inserción y extracción se realizan a través del tope, por lo
cual no se puede acceder a cualquier elemento de la pila. Se la suele llamar estructura
L.I.F.O. como acrónimo de las palabras inglesas “last in, first out” (último en entrar,
primero en salir). La pila se considera un grupo ordenado de elementos, teniendo en
cuenta que el orden de los mismos depende del tiempo que lleven “dentro” de la
estructura.
Las pilas son frecuentemente utilizadas en el desarrollo de sistemas informáticos y
software en general. Por ejemplo, el sistema de soporte en tiempo de compilación y
ejecución del Pascal utiliza una pila para llevar la cuenta de los parámetros de
procedimientos y funciones, variables locales, globales y dinámicas. Este tipo de
estructuras también son utilizadas para traducir expresiones aritméticas o cuando se
quiere recordar una secuencia de acciones u objetos en el orden inverso del ocurrido.
Dada la definición teórica de una pila, podremos representar la misma en forma gráfica
como se ve en la figura:
La pila recién creada se encuentra 1 TOPE
vacía, el tope apunta a nil.
Se desean ingresar los elementos 5
1, 5 y 7 en ese orden.
Definición dinámica de una pila:
Las operaciones que definen el comportamiento de una pila o primitivas son las
siguientes:
     • Crear pila.
     • Insertar elemento.
     • Retirar elemento.
     • Pila vacía.
     • Vaciar pila.
La definición junto con la implementación de éste tipo de estructura, es conveniente
realizarlas en una unidad de biblioteca, de este modo se mantiene el nivel de abstracción
de la estructura.
Unit Pilas;
Interface
type
tipo_dato = <dato a almacenar>;
tptr_nodo_pila = ^tnodo_pila
tnodo_pila = record
dato : tipo_dato;
enlace : tptr_nodo_pila;
end;
Colas:
Una cola es una colección de elementos homogéneos (almacenados en dicha
estructura), en la misma se pueden insertar elementos por uno de los extremos, llamado
frente, y retirar los mismos por el otro extremo, denominado final.
Es importante aclarar que, tanto el frente como el final de la cola, son los únicos
indicados para retirar e insertar elementos, respectivamente. Esto nos indica que no
podemos acceder directamente a cualquier elemento de la cola, sino solo al primero, o
sea el que está o se encuentra en el frente, y no se pueden insertar elementos en
cualquier posición sino solo por el final, así el elemento insertado queda como último.
Por esta razón la cola es denominada una estructura F.I.F.O., o simplemente una lista
F.I.F.O., esto representa el acrónimo de las palabras inglesas “first in, first out” (primero
en entrar, primero en salir). Gráficamente podemos representarla como:
La cola fue recién creada y esta vacía. (frente y final apuntan FINAL FRENTE a nil).
Si ahora le ingresamos el elemento A, la misma quedará se la siguiente manera:
Como A es el único A elemento, frente y final apuntan a él. FINAL nil FRENTE
Si a continuación se ingresa el elemento B, el frente de la cola continuará apuntando a A,
pero ahora el final apuntará al elemento recién ingresado.
B A El enlace se realiza desde el frente hacia el final. FINAL nil FRENTE
Al retirar un elemento, el frente apuntará al siguiente del elemento retirado y en el caso
que la cola quedara vacía, frente y final apuntarán a nil.
B A elemento retirado. FINAL nil FRENTE
FINAL FRENTE
nil nil
Ahora bien, una vez conocido el comportamiento de las colas veremos como se definen
las mismas y su forma de manejo, o “comportamiento” de la cola.
Para trabajar con una cola, así como para cualquier tipo de estructura abstracta,
tendremos que definir las operaciones que representen el comportamiento de la misma,
para de esta manera poder utilizarlas. Dichas operaciones son:
     • Crear cola.
     • Insertar elemento.
     • Retirar elemento.
     • Cola vacía.
     • Vaciar cola.
Podemos definir una cola en forma dinámica implementándola como una lista simple y
respetando las restricciones de inserción (sólo se puede realizar a través del final) y
extracción (sólo se puede realizar por el frente).
A partir de la definición dada, podremos implementar una estructura de tipo cola en una
unidad de biblioteca de la siguiente manera.
Unit Colas;
interface
type
tipo_dato = <dato a almacenar>;
ptr_nodo_cola = ^tnodo_cola;
tnodo_cola = record
dato : tipo_dato;
enlace : ptr_nodo_cola;
end;
Cola de prioridad:
Una cola de prioridad es una estructura característica, donde se pude retirar e insertar
un ítem teniendo en cuenta la clave más grande o más chica (según la implementación)
definida por el programador. Si los ítems tienen claves iguales, entonces la regla usual
utilizada es que el primer ítem insertado es el que se retirará primero.
Algunas aplicaciones de éste tipo de estructura son: la representación simulada de
eventos dependientes del tiempo, como por ejemplo el funcionamiento de un
aeropuerto, controlando partidas y aterrizajes de aviones. Otro ejemplo puede verse en
los sistemas informáticos, el CPU asigna prioridades a las distintas tareas que debe
ejecutar y las inserta en su cola, para de esta manera realizarlas en el orden correcto
(multitareas).
Podemos representar una cola de prioridad como una lista contigua ordenada, en la cual
retirar un ítem es una operación inmediata, pero la inserción tomaría un tiempo
proporcional al número de elementos que se encuentren en la cola, hay que tener en
cuenta que dicha operación se debe realizar en forma tal que la cola quede ordenada.
Otra forma de representación es a través de una lista desordenada, en la cual el proceso
de inserción es inmediato, pero el de extracción es muy lento, ya que debo recorrer toda
la cola para encontrar el ítem que debo retirar.

Deja un comentario o(‧'.'‧)o

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s