COLAS Agregar: Inserta un elemento al final de la cola.
Leer: Lee y elimina un elemento del principio de la cola.
DEFINICIÓN
Una cola es un tipo de estructura de datos en la que sólo se puede insertar nodos en Agregar elemento en una cola
uno de los extremos de la lista y sólo se pueden eliminar nodos en el otro. Además, a) Insertar elemento en una cola vacía
como sucede con las pilas, las escrituras de datos siempre son inserciones de nodos, y
las lecturas siempre eliminan el nodo leído. Partiremos de que ya tenemos el nodo a insertar y,
Este tipo de lista es conocido como lista FIFO (First In First Out), el primero en entrar por supuesto un puntero que apunte a él, además
es el primero en salir. los punteros que definen la cola, primero y último
que valdrán NULO:
Como ejemplo podríamos mencionar una cola para comprar, por ejemplo, las entradas
del cine. Los nuevos compradores sólo pueden colocarse al final de la cola, y sólo el El proceso es muy simple, bastará con que:
primero de la cola puede comprar la entrada.
1. Hacer que nodo.siguiente apunte a NULO.
Para el manejo de colas se necesitan dos punteros o variables: frente y final, y la lista
2. Que el puntero primero apunte a nodo.
o array de n elementos.
3. Y que el puntero último también apunte a nodo.
b) Agregar elemento en una cola NO vacía
El proceso sigue siendo muy sencillo:
1. Hacemos que nodo.siguiente apunte a NULO.
El nodo típico para construir colas es el mismo para la construcción de listas:
2. Después que ultimo.siguiente apunte a DATO (último.nodo).
struct nodo { 3. Y actualizamos último, haciendo que apunte a nodo.
int dato;
struct nodo *siguiente; c) Agregar elemento en una cola, caso general
}
Para generalizar el caso anterior, sólo necesitamos agregar una operación:
Teniendo en cuenta que las lecturas y escrituras en una cola se hacen siempre en 1. Hacemos que nodo.siguiente apunte a NULO.
extremos distintos, lo más fácil será insertar nodos por el final, y leerlos desde el 2. Si último no es NULO, hacemos que ultimo.siguiente apunte a nodo.
principio. 3. Y actualizamos último, haciendo que apunte a nodo.
4. Si primero es NULO, significa que la cola estaba vacía, así que haremos que
OPERACIONES BÁSICAS CON COLAS
primero apunte también a nodo.
De nuevo nos encontramos ante una estructura con muy pocas operaciones
disponibles. Las colas sólo permiten agregar (por el final) y leer (por el principio)
elementos:
1 / 1/1 1/2
ELIMINAR UN ELEMENTO DE UNA COLA 4. Liberamos la memoria asignada al primer nodo, el que queremos eliminar.
5. Si primero es NULO, hacemos que ultimo también apunte a NULO, ya que la
a) Eliminar un elemento en una cola con más de un elemento
lectura ha dejado la cola vacía.
Usaremos un puntero a un nodo auxiliar:
1. Hacemos que nodo apunte al primer elemento de la cola, es decir a primero. Ejemplo de Cola en java usando vectores. Ejemplo
2. Asignamos a primero la dirección del segundo nodo de la pila: primero.siguiente import java.io.*;
3. Guardamos el contenido del nodo para devolverlo como retorno, recuerda que
public class Cola001 {
la operación de lectura en colas implican también borrar.
public static class ClaseColas { // Declaracion de la clase de Colas
4. Liberamos la memoria asignada al primer nodo, el que queremos eliminar.
static int max=10; // Tamano maximo de la Cola
static int cola[]= new int[max]; // Declaracion del arreglo
static int frente, fin; // Indicadores de inicio y fin de la Cola
ClaseColas() { // Constructor que inicializa el frente y el final de la Cola
b) Eliminar elemento de una Cola con un elemento frente=0; fin=0;
También necesitamos un puntero a un nodo auxiliar:
System.out.println("Cola inicializada !!!");
}
public static void Insertar(int dato) {
if(fin==max) { // Esta llena la Cola?
System.out.println("\nCola llena !!!");
return;
1. Hacemos que nodo apunte al primer elemento de la pila, es decir a primero. }
2. Asignamos NULO a primero, que es la dirección del segundo nodo teórico de la cola[fin++]=dato;
cola: primero.siguiente. System.out.println("Dato insertado !!!");
3. Guardamos el contenido del nodo para devolverlo como retorno, recuerda que la }
operación de lectura en colas implican también borrar.
4. Liberamos la memoria asignada al primer nodo, el que queremos eliminar. public static void Eliminar() {
5. Hacemos que último apunte a NULO, ya que la lectura ha dejado la cola vacía. System.out.println("\n\n<<< ELIMINANDO FRENTE DE LA COLA >>>");
if(frente==fin) { // Esta vacia la Cola?
c) Eliminar un elemento en una cola caso general System.out.println("\nCola vacia !!!");
1. Hacemos que nodo apunte al primer elemento de la pila, es decir a primero. return;
2. Asignamos a primero la dirección del segundo nodo de la pila: primero.siguiente. }
3. Guardamos el contenido del nodo para devolverlo como retorno, recuerda que la System.out.println("Elemento eliminado: "+cola[frente++]);
operación de lectura en colas implican también borrar. }
2 / 1/1 2/2
public static void Mostrar() { public static void Inserta() throws IOException {
int i=0; int elemento=0;
System.out.println("\n\n<<< DATOS EN LA COLA >>>"); System.out.println("\n\n<<< INSERTAR DATO ENLA COLA >>>");
if(frente==fin) System.out.println("\nCola vacia !!!"); System.out.print("Elemento a insertar? ---> ");
for(i=frente; i<fin; i++) { elemento=getInt();
System.out.println("cola["+i+"]="+" "+cola[i]); Cola.Insertar(elemento); // Invocar el metodo Insertar del objeto Cola
} }
System.out.println("\nFrente= "+frente);
// Funcion para capturar una cadena desde el teclado
System.out.println("Final = "+fin);
public static String getString() throws IOException {
System.out.println("Max = "+max);
InputStreamReader isr = new InputStreamReader(System.in);
}
BufferedReader br = new BufferedReader(isr);
}
String s = br.readLine();
static ClaseColas Cola=new ClaseColas(); // Declaracion del objeto Cola return s;
}
// Funcion principal
public static void main(String args[]) throws IOException { // Funcion para capturar un entero desde el teclado
int op=0; public static int getInt() throws IOException {
do { String s = getString();
System.out.println("\n\n<<< COLAS >>>"); return Integer.parseInt(s);
System.out.println("1.- Insertar"); }
System.out.println("2.- Eliminar"); }
System.out.println("3.- Mostrar");
System.out.println("0.- Salir"); APLICACIONES DEL USO DE COLAS
System.out.print("Opcion? ---> "); Las colas se pueden utilizar habitualmente en muchas áreas de la informática. Quizás
op=getInt(); la aplicación más común de las colas es la organización de tareas de un ordenador. En
general, los trabajos enviados a un ordenador son “encolados” por éste, para ir
switch(op) { procesando secuencialmente todos los trabajos en el mismo orden en que se reciben.
case 1 : Inserta(); break; Cuando el ordenador recibe el encargo de realizar una tarea, ésta es almacenada al
case 2 : Cola.Eliminar(); break; final de la cola de trabajos. En el momento que la tarea que estaba realizando el
case 3 : Cola.Mostrar(); break; procesador acaba, éste selecciona la tarea situada al principio de la cola para ser
} ejecutada a continuación.
} while(op!=0); De esta manera, la maquina controla el envío de trabajos al dispositivo, no enviando
} un trabajo hasta que la impresora no termine con el anterior.
3 / 1/1 3/2
COLA CIRCULAR } else if(Frente==-1 && Final==-1){
Final++; Frente++;
Una cola circular o anillo es una estructura de datos en VH[Final]= Integer.parseInt(JOptionPane.showInputDialog("Ingrese Datos"));
la que los elementos están de forma circular y cada }else if(Frente!=-1 && Final!=Max){
elemento tiene un sucesor y un predecesor. Los Final++;
elementos pueden consultarse, agregarse y eliminarse VH[Final]= Integer.parseInt(JOptionPane.showInputDialog("Ingrese Datos"));
únicamente desde la cabeza del anillo que es una }else if(Final==Max && Frente!=0){
posición distinguida. Esta avanza en el sentido de las Final=0;
agujas del reloj. }
break;
En la figura se muestra una cola circular con un solo dato almacenado. La variable final
case 2:
es la posición en donde se hizo la última inserción. Después que se ha producido una
if(Frente==-1 && Final==-1){
inserción, final se mueve circularmente a la derecha.
JOptionPane.showMessageDialog(null, "La Cola Esta Vacia");
PROGRAMA COLA CIRCULAR }else if(Frente==Final){
import javax.swing.*; Final=-1;
Frente=-1;
public class Colas_Circulares {
JOptionPane.showMessageDialog(null, "Se ha Eliminado el Unico Elemento en la cola
public static void main (String args[]) {
circular");
int OP=0;
}else if(Frente!=Final){
int VH[]= new int [50];
Frente++;
int Max=49;
JOptionPane.showMessageDialog(null, "Se ha Eliminado el Primer Elemento de la
int Final=-1, Frente=-1;
Cola");
String A= "\n";
}else if(Final==Max){
while(OP!=5){
Final=0;
OP=Integer.parseInt(JOptionPane.showInputDialog("\t\t\t ********** MENU DE
}
OPCIONES COLA CIRCULAR **********\n"+
break;
"1.Insertar\n"+
case 3:
"2.Eliminar\n"+
A = "\n";
"3.Imprimir\n"+
if(Final!=-1 && Frente!=-1){
"4.Imprimir Frente y Final\n"+
for(int i=Frente;i<=Final;i++){
"5.Salir\n"+
A=A+VH[i]+",";
"ESCRIBA SU OPCIÓN ===> "));
}
switch(OP){
JOptionPane.showMessageDialog(null, "Los Elementos de la Cola son: " + A);
case 1:
}else if(Final!=Max){
if((Final==Max && Frente==0)||(Frente==Final+1)){
for(int j=Final;j<Final;j++){
JOptionPane.showMessageDialog(null, "La Cola esta Llena");
A=A+VH[j]+",";
4 / 1/1 4/2
} EJERCICIOS COLAS
for(int x=Frente;x<=Max;x++){
1. Escriba una rutina que reciba una Cola C de números enteros y mueva sus
A=A+VH[x]+",";
elementos a una nueva cola, pero manteniendo el orden de salida de los elementos.
}
Al finalizar la Cola C no debe contener elementos.
JOptionPane.showMessageDialog(null, "Los Elemetos de la Cola son: " + A); 2. Escriba una rutina que reciba una Cola C de números enteros y mueva sus
}else{ elementos a una nueva cola, pero invirtiendo el orden de salida de los elementos.
JOptionPane.showMessageDialog(null, "La Cola Esta Vacia"); Al finalizar la Cola C no debe contener elementos.
}
break; 3. Escriba una rutina que reciba dos Colas C1 y C2 de números enteros y devuelva una
case 4: nueva Cola con los elementos concatenados en el orden C1 y C2. Es de destacar que
if(Final!=-1 && Frente!=-1){ las Colas recibidas no deben ser sufrir ningún tipo de cambio o alteración.
JOptionPane.showMessageDialog(null, "El Primer Elemento de la Cola es: " 4. Escriba una rutina que reciba dos Colas C1 y C2 de números enteros y proceda a
+VH[Frente]+ " El Ultimo Elemento de la Cola es: " +VH[Final]); intercambiar sus elementos, pero manteniendo el orden de salida de los mismos.
}else{ Al finalizar la rutina, la Cola C1 tendrá los elementos de la Cola C2 y esta a su vez
JOptionPane.showMessageDialog(null, "La Cola Esta Vacia"); tendrá los elementos de la Cola C1.
}
break; 5. Escriba una rutina que reciba una Cola C de números flotantes y devuelva una nueva
case 5: Cola pero con los elementos invertidos, es decir el último de la Cola C, pasará a ser
JOptionPane.showMessageDialog(null, "Gracias Por Utilizar Nuestro Programa, el primero de la nueva Cola. Es de destacar que la Cola C no debe sufrir ningún tipo
EXITOS!!!"); de cambio o alteración.
break; 6. Escriba una rutina que reciba una Cola C de números flotantes y devuelva una Pila,
default: manteniendo el orden de salida de los elementos. Es de destacar que la Cola C no
JOptionPane.showMessageDialog(null, "Ha Digitado una Opcion Fuera de Rango"); debe sufrir ningún tipo de cambio o alteración.
}
} 7. Escribir un programa en el que generen 100 números aleatorios en el rango -25….
} + 25 y se guarden en una cola. Una vez creada la cola, el usuario puede solicitar que
} se forme otra cola con los números negativos que tiene la cola original.
8. Escribir un programa que ingrese dos colas del mismo tipo e indique si las dos colas
son idénticas.
5 / 1/1 5/2