Colas, otra estructura de datos muy interesante la cual tiene una gran serie de aplicaciones en el ambito computacional, aunque esta tambien se implemente en la vida real y podemos notarlo en la fila que hacemos al comprar tortillas o dentro de un super mercado. Una cola funciona mediante FIFO (primero en entrar, primero en salir).

La cola en estructura de datos funciona de manera similar a una cola dentro de un super mercado, cajero, banco, entre otros. A diferencia de una lista enlazada la cola no puede introducir datos en cualquier punto, una cola siempre inserta los datos nuevos al final y elimina al inicio.

Ejemplo: cuando hacemos fila para comprar tortillas (tal vez no todos lo hacen pero creo la mayoría), si la cola esta vacía obviamente usted sera el primero en llegar (aqui es donde entra en juego la variable inicio que sera utilizada en el codigo), supongamos que rapidamente llega un cliente, este no puede ser atendido primero que usted por ende espera al final de la cola y asi sucesivamente los nuevos clientes que van llegando se colocan al final de la cola (se crea una variable fin que estará cambiando siempre haciendo referencia al ultimo cliente que a llegado).

Le han despachado las tortillas ¿que pasa?, sale de la fila dando lugar al cliente que esta detrás de usted (la variable inicio hacia referencia a usted antes de salir, al momento de salir ahora la variable inicio debe hacer referencia al cliente que esta detrás de usted).

Como podrás observar, este tipo de estructura de datos tiene una gran serie de aplicaciones. Espero no confundirlos con este ejemplo, pero he tratado de poner un ejemplo de la vida cotidiana esperando entiendan de manera facil.

Primero comenzaremos creando nuestra clase Nodo:

package estructura.colas;

public class NodoCola {
	
    int elemento;
    NodoCola siguiente;

    public NodoCola(int elemento) {
        this.elemento = elemento;
        siguiente = null;
    }

}

Esta clase se encarga de iniciar los valores de nuestras variables a esta altura todos debemos saber como crear un constructor. Podemos pasar cualquier tipo de dato como parametro, usted puede adaptar el código de acuerdo al problema.

La clase Colas, para facilitar la lectura del código siempre se recomienda crear clases que contengan diferentes partes del código. Esta clase contiene los metodos necesarios con las funciones de una cola.

package estructura.colas;

public class Colas {

    int tamanio;
    NodoCola inicio, fin;

    public Colas() {
        inicio = fin = null;
    }

    public boolean estaVacia() {
        return inicio == null;
    }

    public void insertarCola(int elemento) {
        NodoCola nuevo = new NodoCola(elemento);
        if (estaVacia()) {
            inicio = nuevo;
        } else {
            fin.siguiente = nuevo;
        }
        fin = nuevo;
        tamanio++;
    }

    public int sacarCola() {
        int auxiliar = inicio.elemento;
        inicio = inicio.siguiente;
        tamanio--;
        return auxiliar;
    }

    public void mostrarCola() {
        NodoCola aux = inicio;
        System.out.println();
        while (aux != null) {
            System.out.print("[" + aux.elemento + "]--->");
            aux = aux.siguiente;
        }
    }

    public int inicioCola() {
        return inicio.elemento;
    }

    public int tamanioCola() {
        return tamanio;
    }

}

Realmente usted sera capaz de entender la logica detrás de esto, contiene el metodo sacarCola():

este se encarga de eliminar al primer dato, tomando como base el ejemplo de la cola al comprar tortillas, el primero que esta en la fila sera eliminado.

inicio = inicio.siguiente

esta linea muestra lo que mencionaba anteriormente, supongamos que eres el primero en la fila y te han despachado las tortillas, antes de salir la variable inicio esta haciendo referencia a ti. Pero al momento de salir la variable inicio hace referencia al cliente que estaba detrás de ti (tomando tu lugar y siendo el primero en la fila).

Con lo explicado anteriormente usted sera capaz de entender el metodo insertarCola().

Para facilitarte aun mas las cosas, ahora te mostrare el código para usar los metodos mencionados anteriormente:

package estructura.colas;

import javax.swing.JOptionPane;

public class MainColas {

    public static void main(String[] atrgs) {

        int opcion = 0, elemento;

        Colas cola = new Colas();

        try {

            do {

                opcion = Integer.parseInt(JOptionPane.showInputDialog(null,
                        "1=Insertar un elemento a la cola"
                        + "\n2=Sacar un elemento de la cola"
                        + "\n3=¿La cola esta vacia?"
                        + "\n4=¿Que elemento esta en el inicio de la cola?"
                        + "\n5=Tamaño de la cola"
                        + "\n6=Limpiar la cola"
                        + "\n7=Mostrando la colas"
                        + "\n8=Salir", "Menu de Opciones", 3));

                switch (opcion) {

                    case 1:
                        elemento = Integer.parseInt(JOptionPane.showInputDialog(null, "Inserta un elemento",
                                "Insertando al final", JOptionPane.INFORMATION_MESSAGE));

                        cola.insertarCola(elemento);
                        break;

                    case 2:
                        if (!cola.estaVacia()) {
                            elemento = cola.sacarCola();

                            JOptionPane.showMessageDialog(null, "El elemento sacado es: " + elemento,
                                    "Sacando elemento de la cola", JOptionPane.INFORMATION_MESSAGE);
                        } else {
                            JOptionPane.showMessageDialog(null, "La cola esta vacia.",
                                    "Cola vacia", JOptionPane.INFORMATION_MESSAGE);
                        }
                        break;

                    case 3:
                        if (cola.estaVacia()) {
                            JOptionPane.showMessageDialog(null, "La cola esta vacia.",
                                    "Cola vacia", JOptionPane.INFORMATION_MESSAGE);
                        } else {
                            JOptionPane.showMessageDialog(null, "La Cola no esta vacia.",
                                    "Cola contiene datos", JOptionPane.INFORMATION_MESSAGE);
                        }
                        break;

                    case 4:
                        if (!cola.estaVacia()) {
                            elemento = cola.inicioCola();
                            JOptionPane.showMessageDialog(null, "El elemento que esta al incio de la cola: " + elemento,
                                    "Mostrando elemento del inicio de la cola", JOptionPane.INFORMATION_MESSAGE);
                        } else {
                            JOptionPane.showMessageDialog(null, "La cola esta vacia.",
                                    "Cola Vacia", JOptionPane.INFORMATION_MESSAGE);
                        }
                        break;

                    case 5:
                        elemento = cola.tamanioCola();
                        JOptionPane.showMessageDialog(null, "El tamaño de la cola es: " + elemento,
                                "Mostrando tamaño de la cola", JOptionPane.INFORMATION_MESSAGE);
                        break;

                    case 6:
                        /*if(!pilad.estaVacia()) {
							pilad.limpiarPila();
							JOptionPane.showMessageDialog(null, "La pila se ha vaciado", 
									"vaciando pila", JOptionPane.INFORMATION_MESSAGE);
						}else {
							JOptionPane.showMessageDialog(null, "La pila esta vacia, no hay nada que vaciar", 
									"Pila Vacia", JOptionPane.INFORMATION_MESSAGE);
						}*/
                        break;

                    case 7:
                        if (!cola.estaVacia()) {
                            cola.mostrarCola();
                        } else {
                            JOptionPane.showMessageDialog(null, "La pila esta vacia, no hay nada que mostrar",
                                    "Pila Vacia", JOptionPane.INFORMATION_MESSAGE);
                        }
                        break;

                    case 8:
                        JOptionPane.showMessageDialog(null, "Aplicacion Finalizada",
                                "Finalizando", JOptionPane.INFORMATION_MESSAGE);
                        break;

                    default:
                        JOptionPane.showMessageDialog(null, "La opcion no esta en el menu",
                                "Incorrecta", JOptionPane.INFORMATION_MESSAGE);
                }

            } while (opcion != 8);

        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(null, "Error: " + e.getMessage());
        }

    }

}