Diferencia entre revisiones de «Cola (Estructura de datos)»

(Página creada con '{{Referencia}}Cola (informática) Una cola es una estructura de datos, caracterizada por ser una secuencia de elementos en la que la operación de inserción push se realiza por…')
 
 
(No se muestran 9 ediciones intermedias de 7 usuarios)
Línea 1: Línea 1:
{{Referencia}}Cola (informática) Una cola es una estructura de datos, caracterizada por ser una secuencia de elementos en la que la operación de inserción push se realiza por un extremo y la operación de extracción pop por el otro. También se le llama estructura FIFO (del inglés First In First Out), debido a que el primer elemento en entrar será también el primero en salir.  
+
{{Otros usos|este=Cola|Cola (desambiguación)}}
 +
{{Definición
 +
|Nombre= Cola
 +
|imagen= cola_informat.gif
 +
|concepto= Una cola es una estructura de datos donde el primer elemento en entrar es el primero en salir.
 +
}}  
 +
'''Cola''' (informática). Una cola es una estructura de datos, caracterizada por ser una secuencia de elementos en la que la operación de inserción ''push'' se realiza por un extremo y la operación de extracción ''pop'' por el otro. También se le llama estructura [[FIFO]] (del inglés First In First Out), debido a que el primer elemento en entrar será también el primero en salir.  
  
Las colas se utilizan en sistemas informáticos, transportes y operaciones de investigación (entre otros), dónde los objetos, personas o eventos son tomados como datos que se almacenan y se guardan mediante colas para su posterior procesamiento. Este tipo de estructura de datos abstracta se implementa en lenguajes orientados a objetos mediante clases, en forma de listas enlazadas.  
+
Las colas se utilizan en sistemas informáticos, transportes y operaciones de investigación (entre otros), dónde los objetos, personas o eventos son tomados como datos que se almacenan y se guardan mediante colas para su posterior procesamiento. Este tipo de estructura de datos abstracta se implementa en lenguajes orientados a objetos mediante clases, en forma de [[listas enlazadas]].  
  
 
== Usos concretos de la cola  ==
 
== Usos concretos de la cola  ==
 +
[[Image:ColaProg.JPG|thumb|right|200px|Ejemplo de Cola]]
 +
La particularidad de una estructura de datos de cola es el hecho de que sólo podemos acceder al primer y al último elemento de la estructura. Así mismo, los elementos sólo se pueden eliminar por el principio y sólo se pueden añadir por el final de la cola.
  
La particularidad de una estructura de datos de cola es el hecho de que sólo podemos acceder al primer y al último elemento de la estructura. Así mismo, los elementos sólo se pueden eliminar por el principio y sólo se pueden añadir por el final de la cola.[[Image:ColaProg.JPG|border|right|Ejemplo de Cola]] Ejemplos de colas en la vida real serían: personas comprando en un supermercado, esperando para entrar a ver un partido de béisbol, esperando en el cine para ver una película, una pequeña peluquería, etc. La idea esencial es que son todos líneas de espera.  
+
Ejemplos de colas en la vida real serían: personas comprando en un supermercado, esperando para entrar a ver un partido de béisbol, esperando en el cine para ver una película, una pequeña peluquería, etc. La idea esencial es que son todos líneas de espera.  
  
En estos casos, el primer elemento de la lista realiza su función (pagar comida, pagar entrada para el partido o para el cine) y deja la cola. Este movimiento está representado en la cola por la función pop o desencolar. Cada vez que otro elemento se añade a la lista de espera se añaden al final de la cola representando la función ''push'' o encolar. Hay otras funciones auxiliares para ver el tamaño de la cola (''size''), para ver si está vacía en el caso de que no haya nadie esperando (''empty'') o para ver el primer elemento de la cola (''front'').  
+
En estos casos, el primer elemento de la [[lista]] realiza su función (pagar comida, pagar entrada para el partido o para el [[cine]]) y deja la cola. Este movimiento está representado en la cola por la función pop o desencolar. Cada vez que otro elemento se añade a la lista de espera se añaden al final de la cola representando la función ''push'' o encolar. Hay otras funciones auxiliares para ver el tamaño de la cola (''size''), para ver si está vacía en el caso de que no haya nadie esperando (''empty'') o para ver el primer elemento de la cola (''front'').
  
 
== Información adicional  ==
 
== Información adicional  ==
  
Teóricamente, la característica de las colas es que tienen una capacidad específica. Por muchos elementos que contengan siempre se puede añadir un elemento más y en caso de estar vacía borrar un elemento sería imposible hasta que no se añade un nuevo elemento. A la hora de añadir un elemento podríamos darle una mayor importancia a unos elementos que a otros (un cargo VIP) y para ello se crea un tipo de cola especial que es la cola de prioridad. (Ver [[Cola de prioridad (estructura de datos)|cola de prioridad]]).  
+
Teóricamente, la característica de las colas es que tienen una capacidad específica. Por muchos elementos que contengan siempre se puede añadir un elemento más y en caso de estar vacía borrar un elemento sería imposible hasta que no se añade un nuevo [[elemento]]. A la hora de añadir un elemento podríamos darle una mayor importancia a unos elementos que a otros (un cargo VIP) y para ello se crea un tipo de cola especial que es la cola de prioridad. (Ver [[Cola de prioridad (estructura de datos)|cola de prioridad]]).  
  
Esto es una falacia  
+
Esto es una falacia.
  
 
== Operaciones Básicas  ==
 
== Operaciones Básicas  ==
Línea 24: Línea 32:
 
== Implementaciones  ==
 
== Implementaciones  ==
  
=== Colas en Maude ===
+
=== Colas en Maude ===
  
La ColaNV es la cola no vacía, que diferenciamos de la cola normal a la hora de tomar en cuenta errores. A su vez, el elemento X representa el tipo de valor que puede contener la cola: entero, carácter, registro....  
+
La ColaNV es la cola no vacía, que diferenciamos de la cola normal a la hora de tomar en cuenta errores. A su vez, el elemento X representa el tipo de valor que puede contener la cola: entero, carácter, registro....etc
<pre> fmod COLA {X&nbsp;:: TRIV} is
+
<source lang=CPP>
 +
fmod COLA {X :: TRIV} is
 
     sorts ColaNV{X} Cola{X} .
 
     sorts ColaNV{X} Cola{X} .
     subsort ColaNV{X} &lt; Cola{X} .
+
     subsort ColaNV{X} < Cola{X} .
 
     *** generadores
 
     *** generadores
     op crear &nbsp;: -&gt; Cola{X} [ctor] .
+
     op crear   : -> Cola{X} [ctor] .
     op encolar&nbsp;: X$Elt Cola{X} -&gt; ColaNV {X} [ctor] .
+
     op encolar : X$Elt Cola{X} -> ColaNV {X} [ctor] .
  
 
     *** constructores
 
     *** constructores
     op desencolar&nbsp;: Cola{X} -&gt; Cola{X} .
+
     op desencolar : Cola{X} -> Cola{X} .
  
 
     *** selectores
 
     *** selectores
     op frente&nbsp;: ColaNV{X} -&gt; X$Elt .
+
     op frente : ColaNV{X} -> X$Elt .
  
 
     *** variables
 
     *** variables
     var C&nbsp;: ColaNV{X} .
+
     var C : ColaNV{X} .
     vars E E2&nbsp;: X$Elt .
+
     vars E E2 : X$Elt .
  
 
     *** ecuaciones
 
     *** ecuaciones
Línea 69: Línea 78:
 
  
 
  
 
   *** operaciones propias de la cola de colas de enteros
 
   *** operaciones propias de la cola de colas de enteros
op encolarInt   &nbsp;: Int ColaNV{VColaInt} -&gt; ColaNV{VColaInt} .
+
op encolarInt   : Int ColaNV{VColaInt} -> ColaNV{VColaInt} .
op desencolarInt&nbsp;: Cola{VColaInt}      -&gt; Cola{VColaInt} .
+
op desencolarInt : Cola{VColaInt}      -> Cola{VColaInt} .
op frenteInt   &nbsp;: ColaNV{VColaInt}    -&gt; [Int] .
+
op frenteInt     : ColaNV{VColaInt}    -> [Int] .
 
 
 
*** variables
 
*** variables
var CCNV&nbsp;: ColaNV{VColaInt} .
+
var CCNV : ColaNV{VColaInt} .
var CC &nbsp;: Cola{VColaInt} .
+
var CC   : Cola{VColaInt} .
var CE &nbsp;: Cola{VInt} .
+
var CE   : Cola{VInt} .
var E   &nbsp;: Int .
+
var E   : Int .
 
 
 
*** ecuaciones
 
*** ecuaciones
Línea 87: Línea 96:
 
eq frenteInt(CCNV) = frente(frente(CCNV)) .
 
eq frenteInt(CCNV) = frente(frente(CCNV)) .
 
   endfm
 
   endfm
</pre>  
+
</source>
=== Colas en C++  ===
 
<pre>#ifndef COLA
 
#define COLA // Define la cola
 
template &lt;class T&gt;
 
class Cola{
 
private:
 
struct Nodo{
 
T elemento;
 
struct Nodo* siguiente; // coloca el nodo en la segunda posición
 
}* primero;
 
struct Nodo* ultimo;
 
unsigned int elementos;
 
public:
 
Cola(){
 
elementos = 0;
 
}
 
~Cola(){
 
while (elementos != 0) pop();
 
}
 
void push(const T&amp; elem){
 
Nodo* aux = new Nodo;
 
aux-&gt;elemento = elem;
 
if (elementos == 0) primero = aux;
 
else ultimo-&gt;siguiente = aux;
 
ultimo = aux;
 
++elementos;
 
}
 
void pop(){
 
Nodo* aux = primero;
 
primero = primero-&gt;siguiente;
 
delete aux;
 
--elementos;
 
}
 
T consultar() const{
 
return primero-&gt;elemento;
 
}
 
bool vacia() const{
 
return elementos == 0;
 
}
 
unsigned int size() const{
 
return elementos;
 
}
 
};
 
#endif
 
</pre>
 
=== Colas en JAVA  ===
 
<pre>public void inserta(Elemento x) {
 
Nodo Nuevo;
 
Nuevo = new Nodo(x, null);
 
if (NodoCabeza == null) {
 
NodoCabeza = Nuevo;
 
} else {
 
NodoFinal.Siguiente = Nuevo;
 
}
 
NodoFinal = Nuevo;
 
}
 
  
public Elemento cabeza() throws IllegalArgumentException {
+
=== Colas en C++ ===
if (NodoCabeza == null) {
 
throw new IllegalArgumentException();
 
} else {
 
return NodoCabeza.Info;
 
}
 
}
 
  
public Cola() {
+
<source lang=CPP>
// Devuelve una Cola vacía
+
  #ifndef COLA
NodoCabeza = null;
+
  #define COLA // Define la cola
NodoFinal = null;
+
  template <class T>
}
+
  class Cola{
</pre>  
+
      private:
=== Colas en C#  ===
+
        struct Nodo{
<pre>public partial class frmPrincipal
+
            T elemento;
{
+
            struct Nodo* siguiente;  // coloca el nodo en la segunda posición
// Variables globales
+
        }* primero;
public static string[] Cola;
+
        struct Nodo* ultimo;
public static int Frente;
+
        unsigned int elementos;
public static int Final;
+
      public:
public static int N;
+
        Cola(){
 +
            elementos = 0;
 +
        }
 +
        ~Cola(){
 +
            while (elementos != 0) pop();
 +
        }
 +
        void push(const T& elem){
 +
            Nodo* aux = new Nodo;
 +
            aux->elemento = elem;
 +
            if (elementos == 0) primero = aux;
 +
            else ultimo->siguiente = aux;
 +
            ultimo = aux;
 +
            ++elementos;
 +
        }
 +
        void pop(){
 +
            Nodo* aux = primero;
 +
            primero = primero->siguiente;
 +
            delete aux;
 +
            --elementos;
 +
        }
 +
        T consultar() const{
 +
            return primero->elemento;
 +
        }
 +
        bool vacia() const{
 +
            return elementos == 0;
 +
        }
 +
        unsigned int size() const{
 +
            return elementos;
 +
        }
 +
    };
 +
    #endif
 +
</source>
  
[STAThread]
+
=== Colas en JAVA ===
public static void Main(string[] args)
+
<source lang=java>
{
+
    public void inserta(Elemento x) {
Application.EnableVisualStyles();
+
        Nodo Nuevo;
Application.SetCompatibleTextRenderingDefault(false);
+
        Nuevo = new Nodo(x, null);
Application.Run(new frmPrincipal());
+
        if (NodoCabeza == null) {
}
+
            NodoCabeza = Nuevo;
 +
        } else {
 +
            NodoFinal.Siguiente = Nuevo;
 +
        }
 +
        NodoFinal = Nuevo;
 +
    }
  
public frmPrincipal() // Constructor
+
    public Elemento cabeza() throws IllegalArgumentException {
{
+
        if (NodoCabeza == null) {
 +
            throw new IllegalArgumentException();
 +
        } else {
 +
            return NodoCabeza.Info;
 +
        }
 +
    }
  
InitializeComponent();
+
    public Cola() {
 +
    // Devuelve una Cola vacía
 +
        NodoCabeza = null;
 +
        NodoFinal = null;          //Realizado Por Lic: Helton Petters
 +
    }
 +
</source>
  
Cola = new string[5]; // Arreglo lineal de 5
+
=== Colas en C# ===
N = 4;
+
<source lang=csharp>
Frente = -1;
+
public partial class frmPrincipal
Final = -1;
+
    {
}
+
        // Variables globales
 +
        public static string[] Cola;
 +
        public static int Frente;
 +
        public static int Final;
 +
        public static int N;
 +
 +
        [STAThread]
 +
        public static void Main(string[] args)
 +
        {
 +
            Application.EnableVisualStyles();
 +
            Application.SetCompatibleTextRenderingDefault(false);
 +
            Application.Run(new frmPrincipal());
 +
        }
 +
 +
        public frmPrincipal()    // Constructor
 +
        {
 +
 +
            InitializeComponent();
 +
 +
            Cola = new string[5];   // Arreglo lineal de 5
 +
            N = 4;
 +
            Frente = -1;
 +
            Final = -1;
 +
        }
 +
 +
        void CmdInsercionClick(object sender, System.EventArgs e)
 +
        {
 +
            frmInsercion Insercion = new frmInsercion();
 +
            Insercion.Show();
 +
        }
 +
 +
        void CmdRecorridoClick(object sender, System.EventArgs e)
 +
        {
 +
            frmRecorrido Recorrido = new frmRecorrido();
 +
            Recorrido.Show();
 +
        }
 +
 +
        void CmdBusquedaClick(object sender, EventArgs e)
 +
        {
 +
            frmBusqueda Busqueda = new frmBusqueda();
 +
            Busqueda.Show();
 +
        }
 +
 +
        void CmdEliminacionClick(object sender, EventArgs e)
 +
        {
 +
            frmEliminacion Eliminar = new frmEliminacion();
 +
            Eliminar.Show();
 +
        }
 +
    }
  
void CmdInsercionClick(object sender, System.EventArgs e)
+
</source>
{
+
Algoritmo Insertar(Cola, N, Frente, Final, Elemento)
frmInsercion Insercion = new frmInsercion();
+
<source lang=csharp>
Insercion.Show();
 
}
 
  
void CmdRecorridoClick(object sender, System.EventArgs e)
+
void CmdInsertarClick(object sender, System.EventArgs e)
{
+
        {
frmRecorrido Recorrido = new frmRecorrido();
+
            elemento = txtInsercion.Text;
Recorrido.Show();
+
            // Se verifica que haya espacio en la Cola
}
+
            if (frmPrincipal.Frente == 0 && frmPrincipal.Final == frmPrincipal.N)
 +
            {
 +
                MessageBox.Show("La Cola esta llena");
 +
                return;
 +
            }
 +
            if (frmPrincipal.Frente == frmPrincipal.Final + 1)
 +
            {
 +
                MessageBox.Show("La Cola esta llena");
 +
                return;
 +
            }
 +
 +
            // Si la cola esta vacia se inicializan punteros
 +
            if (frmPrincipal.Frente == -1)
 +
            {
 +
                frmPrincipal.Frente = 0;
 +
                frmPrincipal.Final = 0;
 +
            }
 +
            else if (frmPrincipal.Final == frmPrincipal.N)
 +
            {
 +
                frmPrincipal.Final = 0;
 +
            }
 +
            else
 +
            {
 +
                frmPrincipal.Final = frmPrincipal.Final + 1;
 +
            }
 +
            // Se agrega elemento a la Cola
 +
            frmPrincipal.Cola[frmPrincipal.Final] = elemento;
 +
            txtInsercion.Text = "";
 +
 +
        }
  
void CmdBusquedaClick(object sender, EventArgs e)
+
</source>
{
+
Algoritmo Eliminación (Cola, Frente, Final, N)
frmBusqueda Busqueda = new frmBusqueda();
+
<source lang=csharp>
Busqueda.Show();
 
}
 
  
void CmdEliminacionClick(object sender, EventArgs e)
+
void CmdEliminarClick(object sender, EventArgs e)
{
+
        {
frmEliminacion Eliminar = new frmEliminacion();
+
            if (frmPrincipal.Frente == -1)
Eliminar.Show();
+
            {
}
+
                MessageBox.Show("Cola Vacia");
}</pre>
+
                return;
Algoritmo Insertar(Cola, N, Frente, Final, Elemento)<br>
+
            }
<pre>void CmdInsertarClick(object sender, System.EventArgs e)
+
            string elemento = frmPrincipal.Cola[frmPrincipal.Frente];
{
+
elemento = txtInsercion.Text;
+
            // si la cola tiene un solo elemento
// Se verifica que haya espacio en la Cola
+
            if (frmPrincipal.Frente == frmPrincipal.Final)
if (frmPrincipal.Frente == 0 &amp;&amp; frmPrincipal.Final == frmPrincipal.N)
+
            {
{
+
                frmPrincipal.Frente = -1;
MessageBox.Show("La Cola esta llena");
+
                frmPrincipal.Final = -1;
return;
+
            }
}
+
if (frmPrincipal.Frente == frmPrincipal.Final + 1)
+
            else if (frmPrincipal.Frente == frmPrincipal.N)
{
+
            {
MessageBox.Show("La Cola esta llena");
+
                frmPrincipal.Frente = 0;
return;
+
            }
}
+
 +
            else
 +
            {
 +
                frmPrincipal.Frente = frmPrincipal.Frente + 1
 +
            }
 +
 +
            lsEliminado.Items.Add(elemento);
 +
        }
  
// Si la cola esta vacia se inicializan punteros
+
</source>
if (frmPrincipal.Frente == -1)
 
{
 
frmPrincipal.Frente = 0;
 
frmPrincipal.Final = 0;
 
}
 
else if (frmPrincipal.Final == frmPrincipal.N)
 
{
 
frmPrincipal.Final = 0;
 
}
 
else
 
{
 
frmPrincipal.Final = frmPrincipal.Final + 1;
 
}
 
// Se agrega elemento a la Cola
 
frmPrincipal.Cola[frmPrincipal.Final] = elemento;
 
txtInsercion.Text = "";
 
  
}
 
 
</pre>
 
Algoritmo Eliminación (Cola, Frente, Final, N)<br>
 
<pre>Void CmdEliminarClick(object sender, EventArgs e)
 
{
 
if (frmPrincipal.Frente == -1)
 
{
 
MessageBox.Show("Cola Vacia");
 
return;
 
}
 
string elemento = frmPrincipal.Cola[frmPrincipal.Frente];
 
 
// si la cola tiene un solo elemento
 
if (frmPrincipal.Frente == frmPrincipal.Final)
 
{
 
frmPrincipal.Frente = -1;
 
frmPrincipal.Final = -1;
 
}
 
 
else if (frmPrincipal.Frente == frmPrincipal.N)
 
{
 
frmPrincipal.Frente = 0;
 
}
 
 
else
 
{
 
frmPrincipal.Frente = frmPrincipal.Frente + 1;
 
}
 
 
lsEliminado.Items.Add(elemento);
 
}
 
</pre>
 
 
== Tipos de colas  ==
 
== Tipos de colas  ==
  
*''Colas circulares (anillos)'': en las que el último elemento y el primero están unidos.
+
*''[[Colas circulares]] (anillos)'': en las que el último elemento y el primero están unidos.
  
*''Colas de prioridad'': En ellas, los elementos se atienden en el orden indicado por una prioridad asociada a cada uno. Si varios elementos tienen la misma prioridad, se atenderán de modo convencional según la posición que ocupen. Hay 2 formas de implementación:
+
*''[[Colas de prioridad]]'': En ellas, los elementos se atienden en el orden indicado por una prioridad asociada a cada uno. Si varios elementos tienen la misma prioridad, se atenderán de modo convencional según la posición que ocupen. Hay 2 formas de implementación:
  
 
#Añadir un campo a cada nodo con su prioridad. Resulta conveniente mantener la cola ordenada por orden de prioridad.  
 
#Añadir un campo a cada nodo con su prioridad. Resulta conveniente mantener la cola ordenada por orden de prioridad.  
Línea 289: Línea 313:
 
*''Bicolas'': son colas en donde los nodos se pueden añadir y quitar por ambos extremos; se les llama DEQUE (Double Ended QUEue). Para representar las bicolas lo podemos hacer con un array circular con Inicio y Fin que apunten a cada uno de los extremos. Hay variantes:
 
*''Bicolas'': son colas en donde los nodos se pueden añadir y quitar por ambos extremos; se les llama DEQUE (Double Ended QUEue). Para representar las bicolas lo podemos hacer con un array circular con Inicio y Fin que apunten a cada uno de los extremos. Hay variantes:
  
*''Bicolas de entrada restringida'': Son aquellas donde la inserción sólo se hace por el final, aunque podemos eliminar al ''inicio'' ó al ''final''.
+
*''[[Bicolas de entrada restringida]]'': Son aquellas donde la inserción sólo se hace por el final, aunque podemos eliminar al ''inicio'' ó al ''final''.
  
*''Bicolas de salida restringida'': Son aquellas donde sólo se elimina por el final, aunque se puede insertar al ''inicio'' y al ''final''.
+
*''[[Bicolas de salida restringida]]'': Son aquellas donde sólo se elimina por el final, aunque se puede insertar al ''inicio'' y al ''final''.<br>
  
<br>
+
== Fuentes ==
 +
 
 +
*[http://www.mitecnologico.com/Main/EstructuraDatosColas Mi Tecnológico]
 +
*[http://es.wikipedia.org/wiki/Cola_(inform%C3%A1tica) Wikipedia]
 +
*[http://www.calcifer.org/documentos/librognome/glib-lists-queues.html Colas en Informática]
  
 
[[Category:Estructura_de_datos]]
 
[[Category:Estructura_de_datos]]
 
<br>
 

última versión al 08:36 1 ago 2012

Este artículo trata sobre Cola. Para otros usos de este término, véase Cola (desambiguación).
Cola (Estructura de datos)
Información sobre la plantilla
Cola informat.gif
Concepto:Una cola es una estructura de datos donde el primer elemento en entrar es el primero en salir.

Cola (informática). Una cola es una estructura de datos, caracterizada por ser una secuencia de elementos en la que la operación de inserción push se realiza por un extremo y la operación de extracción pop por el otro. También se le llama estructura FIFO (del inglés First In First Out), debido a que el primer elemento en entrar será también el primero en salir.

Las colas se utilizan en sistemas informáticos, transportes y operaciones de investigación (entre otros), dónde los objetos, personas o eventos son tomados como datos que se almacenan y se guardan mediante colas para su posterior procesamiento. Este tipo de estructura de datos abstracta se implementa en lenguajes orientados a objetos mediante clases, en forma de listas enlazadas.

Usos concretos de la cola

Ejemplo de Cola

La particularidad de una estructura de datos de cola es el hecho de que sólo podemos acceder al primer y al último elemento de la estructura. Así mismo, los elementos sólo se pueden eliminar por el principio y sólo se pueden añadir por el final de la cola.

Ejemplos de colas en la vida real serían: personas comprando en un supermercado, esperando para entrar a ver un partido de béisbol, esperando en el cine para ver una película, una pequeña peluquería, etc. La idea esencial es que son todos líneas de espera.

En estos casos, el primer elemento de la lista realiza su función (pagar comida, pagar entrada para el partido o para el cine) y deja la cola. Este movimiento está representado en la cola por la función pop o desencolar. Cada vez que otro elemento se añade a la lista de espera se añaden al final de la cola representando la función push o encolar. Hay otras funciones auxiliares para ver el tamaño de la cola (size), para ver si está vacía en el caso de que no haya nadie esperando (empty) o para ver el primer elemento de la cola (front).

Información adicional

Teóricamente, la característica de las colas es que tienen una capacidad específica. Por muchos elementos que contengan siempre se puede añadir un elemento más y en caso de estar vacía borrar un elemento sería imposible hasta que no se añade un nuevo elemento. A la hora de añadir un elemento podríamos darle una mayor importancia a unos elementos que a otros (un cargo VIP) y para ello se crea un tipo de cola especial que es la cola de prioridad. (Ver cola de prioridad).

Esto es una falacia.

Operaciones Básicas

  • Crear: se crea la cola vacía.
  • Encolar (añadir, entrar, push): se añade un elemento a la cola. Se añade al final de esta.
  • Desencolar (sacar, salir, pop): se elimina el elemento frontal de la cola, es decir, el primer elemento que entró.
  • Frente (consultar, front): se devuelve el elemento frontal de la cola, es decir, el primero elemento que entró.

Implementaciones

Colas en Maude

La ColaNV es la cola no vacía, que diferenciamos de la cola normal a la hora de tomar en cuenta errores. A su vez, el elemento X representa el tipo de valor que puede contener la cola: entero, carácter, registro....etc

fmod COLA {X :: TRIV} is
    sorts ColaNV{X} Cola{X} .
    subsort ColaNV{X} < Cola{X} .
    *** generadores
    op crear   : -> Cola{X} [ctor] .
    op encolar : X$Elt Cola{X} -> ColaNV {X} [ctor] .

    *** constructores
    op desencolar : Cola{X} -> Cola{X} .

    *** selectores
    op frente : ColaNV{X} -> X$Elt .

    *** variables
    var C : ColaNV{X} .
    vars E E2 : X$Elt .

    *** ecuaciones
    eq desencolar(crear) = crear .
    eq desencolar(encolar(E, crear)) = crear .
    eq desencolar(encolar(E, C)) = encolar(E, desencolar(C)) .

    eq frente(encolar(E, crear)) = E .
    eq frente(encolar(E, C)) = frente(C) .
  endfm


Especificación de una cola de colas de enteros en Maude:

  view VInt from TRIV to INT is 
  	sort Elt to Int .
  endv
  
  view VColaInt from TRIV to COLA{VInt} is 
  	sort Elt to Cola{VInt} .
  endv
  
  fmod COLA-COLAS-INT is
  	protecting INT .
  	protecting COLA{VColaInt} .
  		
  	*** operaciones propias de la cola de colas de enteros
	op encolarInt    : Int ColaNV{VColaInt} -> ColaNV{VColaInt} .
	op desencolarInt : Cola{VColaInt}       -> Cola{VColaInt} .
	op frenteInt     : ColaNV{VColaInt}     -> [Int] .
	
	*** variables
	var CCNV : ColaNV{VColaInt} .
	var CC   : Cola{VColaInt} .
	var CE   : Cola{VInt} .
	var E    : Int .
	
	*** ecuaciones	
	eq encolarInt(E, encolar(CE, CC)) = encolar(encolar(E, CE), CC) .

        eq desencolarInt (encolar(CE, crear)) = encolar(desencolar(CE), crear) . 
        eq desencolarInt (encolar(CE, CCNV)) = encolar(CE, desencolarInt(CCNV)) . 

	eq frenteInt(CCNV) = frente(frente(CCNV)) .
  endfm

Colas en C++

  #ifndef COLA
  #define COLA // Define la cola
  template <class T>
  class Cola{
      private:
        struct Nodo{
            T elemento;
            struct Nodo* siguiente;  // coloca el nodo en la segunda posición
        }* primero;
        struct Nodo* ultimo;
        unsigned int elementos;
      public:
        Cola(){
            elementos = 0;
        }
        ~Cola(){
            while (elementos != 0) pop();
        }
        void push(const T& elem){
            Nodo* aux = new Nodo;
            aux->elemento = elem;
            if (elementos == 0) primero = aux;
            else ultimo->siguiente = aux;
            ultimo = aux;
            ++elementos;
        }
        void pop(){
            Nodo* aux = primero;
            primero = primero->siguiente;
            delete aux;
            --elementos;
        }
        T consultar() const{
            return primero->elemento;
        }
        bool vacia() const{
            return elementos == 0;
        }
        unsigned int size() const{
            return elementos;
        }
    };
    #endif

Colas en JAVA

    public void inserta(Elemento x) {
        Nodo Nuevo;
        Nuevo = new Nodo(x, null);
        if (NodoCabeza == null) {
            NodoCabeza = Nuevo;
        } else {
            NodoFinal.Siguiente = Nuevo;
        }
        NodoFinal = Nuevo;
    }

    public Elemento cabeza() throws IllegalArgumentException {
        if (NodoCabeza == null) {
            throw new IllegalArgumentException();
        } else {
            return NodoCabeza.Info;
        }
    }

    public Cola() {
    // Devuelve una Cola vacía
        NodoCabeza = null;
        NodoFinal = null;           //Realizado Por Lic: Helton Petters
    }

Colas en C#

public partial class frmPrincipal
    {
        // Variables globales
        public static string[] Cola;
        public static int Frente;
        public static int Final;
        public static int N;
 
        [STAThread]
        public static void Main(string[] args)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new frmPrincipal());
        }
 
        public frmPrincipal()    // Constructor
        {
 
            InitializeComponent();
 
            Cola = new string[5];   // Arreglo lineal de 5
            N = 4;
            Frente = -1;
            Final = -1;
        }
 
        void CmdInsercionClick(object sender, System.EventArgs e)
        {
            frmInsercion Insercion = new frmInsercion();
            Insercion.Show();
        }
 
        void CmdRecorridoClick(object sender, System.EventArgs e)
        {
            frmRecorrido Recorrido = new frmRecorrido();
            Recorrido.Show();
        }
 
        void CmdBusquedaClick(object sender, EventArgs e)
        {
            frmBusqueda Busqueda = new frmBusqueda();
            Busqueda.Show();
        }
 
        void CmdEliminacionClick(object sender, EventArgs e)
        {
            frmEliminacion Eliminar = new frmEliminacion();
            Eliminar.Show();
        }
    }

Algoritmo Insertar(Cola, N, Frente, Final, Elemento)

void CmdInsertarClick(object sender, System.EventArgs e)
        {
            elemento = txtInsercion.Text;
            // Se verifica que haya espacio en la Cola
            if (frmPrincipal.Frente == 0 && frmPrincipal.Final == frmPrincipal.N)
            {
                MessageBox.Show("La Cola esta llena");
                return;
            }
            if (frmPrincipal.Frente == frmPrincipal.Final + 1)
            {
                MessageBox.Show("La Cola esta llena"); 
                return;
            }
 
            // Si la cola esta vacia se inicializan punteros
            if (frmPrincipal.Frente == -1)
            {
                frmPrincipal.Frente = 0;
                frmPrincipal.Final = 0;
            }
            else if (frmPrincipal.Final == frmPrincipal.N)
            {
                frmPrincipal.Final = 0;
            }
            else
            {
                frmPrincipal.Final = frmPrincipal.Final + 1;
            }
            // Se agrega elemento a la Cola
            frmPrincipal.Cola[frmPrincipal.Final] = elemento;
            txtInsercion.Text = "";
 
        }

Algoritmo Eliminación (Cola, Frente, Final, N)

void CmdEliminarClick(object sender, EventArgs e)
        {
            if (frmPrincipal.Frente == -1)
            {
                MessageBox.Show("Cola Vacia");
                return;
            }
            string elemento = frmPrincipal.Cola[frmPrincipal.Frente];
 
            // si la cola tiene un solo elemento
            if (frmPrincipal.Frente == frmPrincipal.Final)
            {
                frmPrincipal.Frente = -1;
                frmPrincipal.Final = -1;
            }
 
            else if (frmPrincipal.Frente == frmPrincipal.N)
            {
                frmPrincipal.Frente = 0;
            }
 
            else
            {
                frmPrincipal.Frente = frmPrincipal.Frente + 1;   
            }
 
            lsEliminado.Items.Add(elemento);
        }

Tipos de colas

  • Colas circulares (anillos): en las que el último elemento y el primero están unidos.
  • Colas de prioridad: En ellas, los elementos se atienden en el orden indicado por una prioridad asociada a cada uno. Si varios elementos tienen la misma prioridad, se atenderán de modo convencional según la posición que ocupen. Hay 2 formas de implementación:
  1. Añadir un campo a cada nodo con su prioridad. Resulta conveniente mantener la cola ordenada por orden de prioridad.
  2. Crear tantas colas como prioridades haya, y almacenar cada elemento en su cola.
  • Bicolas: son colas en donde los nodos se pueden añadir y quitar por ambos extremos; se les llama DEQUE (Double Ended QUEue). Para representar las bicolas lo podemos hacer con un array circular con Inicio y Fin que apunten a cada uno de los extremos. Hay variantes:

Fuentes