Curso de Java: Diferencia entre colas y pilas

Escrito por Adrián Crespo
Java
0

Volvemos con el curso de Java de RedesZone.net.

En el volumen anterior, vimos un ejemplo con una cola de prioridad, en la que, se insertaban clientes con diferente urgencia, lo cual, condicionaba la disposición de la cola, teniendo en cuenta ese nivel de urgencia.

Hoy, además de daros las clases necesarias para hacer la prueba, también os propondremos un ejercicio para que veáis la diferencia entre las colas y las pilas de datos, que como sabéis no poseen el mismo orden para extraer los datos.

Lo primero de todo, vamos a poneros una posible solución a las clases que faltaban por implementar del ejemplo de la entrega anterior.

– Clase Cliente


public class Cliente
{
 String nombre;
 String DNI;

 public Cliente(String n, String dni)
 {
 nombre=n;
 DNI=dni;
 }

 public String nombre()
 {
 return nombre;

 }

 public String DNI()
 {
 return DNI;
 }

 public String toString()
 {
 return "Nombre del cliente: "+nombre()+" DNI: "+DNI();
 }

}

– Clase Principal


/**
 * Clase para probar la cola de espera
 */
public class Principal
{

 public static void main(String[] args) {

// crear la cola y los clientes
 ColaEsperaConUrgencia cola = new ColaEsperaConUrgencia();

 Cliente c1=new Cliente("a","1");
 Cliente c2=new Cliente("b","2");
 Cliente c3=new Cliente("c","3");
 Cliente c4=new Cliente("d","4");
 Cliente c5=new Cliente("e","5");
 Cliente c6=new Cliente("f","6");

 Cliente atendido;

 // Añadir los clientes a la cola
 cola.nuevoCliente(c1,Urgencia.media);
 cola.nuevoCliente(c2,Urgencia.alta);
 cola.nuevoCliente(c3,Urgencia.baja);
 cola.nuevoCliente(c4,Urgencia.baja);
 cola.nuevoCliente(c5,Urgencia.alta);
 cola.nuevoCliente(c6,Urgencia.media);

 cola.muestraEstado();

 // Atender a los clientes, en dos tandas
 atendido=cola.atenderCliente();
 System.out.println("Atendido: "+atendido);
 atendido=cola.atenderCliente();
 System.out.println("Atendido: "+atendido);
 cola.muestraEstado();

 atendido=cola.atenderCliente();
 System.out.println("Atendido: "+atendido);
 atendido=cola.atenderCliente();
 System.out.println("Atendido: "+atendido);
 atendido=cola.atenderCliente();
 System.out.println("Atendido: "+atendido);
 atendido=cola.atenderCliente();
 System.out.println("Atendido: "+atendido);

 cola.muestraEstado();
 }
}

Alguno de vosotros, habéis comentado que no os extrae de forma correcta los clientes, os vuelvo a poner el código de la clase de la cola, aunque debería funcionar sin ningún tipo de problema.


import java.util.*;
/**
 * Clase que representa una cola de espera de un servicio
 * con urgencia
 */
public class ColaEsperaConUrgencia
{
 /**
 * Clase interna para almacenar los datos
 * de un cliente con urgencia
 */
 private static class DatosCliente implements Comparable<DatosCliente> {
 Cliente c;
 Urgencia urg;

 /**
 * Constructor de DatosCliente
 */
 DatosCliente (Cliente c, Urgencia urg) {
 this.c=c;
 this.urg=urg;
 }

 /**
 * Comparacion de clientes por su urgencia
 */
 public int compareTo(DatosCliente otro) {
 // ojo, el orden esta al reves
 return otro.urg.compareTo(this.urg);
 }

 /**
 * Igualdad, compatible con compareTo
 */
 @Override
 public boolean equals(Object d) {
 if (d instanceof DatosCliente) {
 return this.urg.equals(((DatosCliente)d).urg);
 } else {
 return false;
 }
 }
 }
 // cola del servicio
 private Queue<DatosCliente> colaEspera;

/**
 * Constructor de ColaEspera
 */
 public ColaEsperaConUrgencia()
 {
 colaEspera=new PriorityQueue<DatosCliente>();
 }

/**
 * Nuevo cliente; se mete en la cola de espera
 */
 public void nuevoCliente(Cliente c, Urgencia urg)
 {
 DatosCliente datos=new DatosCliente(c,urg);
 colaEspera.add(datos);
 }

 /**
 * Atender cliente: se saca de la cola de espera
 * retorna el cliente atendido
 */
 public Cliente atenderCliente() throws NoSuchElementException
 {
 DatosCliente datos=colaEspera.remove();
 return datos.c;
 }

 /**
 * Mostrar el estado de la cola de espera
 */
 public void muestraEstado() {
 System.out.println();
 System.out.println("-------Estado de la cola de espera----");
 System.out.println("No atendidos "+colaEspera.size());
 if (colaEspera.size()>0) {
 for (DatosCliente datos:colaEspera) {
 System.out.println(datos.c+" urgencia: "+datos.urg);
 }
 }
 System.out.println();
 }

 /**
 * Num clientes en espera
 */
 public int numClientesEnEspera() {
 return colaEspera.size();
 }
}

Vamos ahora a plantearos un ejercicio para que seáis capaces de entender la diferencia entre pilas y colas, no sin antes, una explicación gráfica:

– Pilas

– Colas

Partiendo por lo tanto de la interfaz Queue para las colas  y la interfaz Pila<E>, no implementada y que responde a la siguiente:

import java.util.*;
/**
 * Interfaz que representa una pila abstracta
 */

public interface Pila<E>
{
 void apila(E e);
 E desapila() throws NoSuchElementException;
 void hazNula();
 E cima() throws NoSuchElementException;
 boolean estaVacia();
 int tamano();
}

Se pide crear  las clases que sean necesarias (ColaNumeros, PilaNumeros y Principal), además de copiar y pegar el código de la interfaz Pila<E> que hemos proporcionado, para simular una asignación de árbitros a los partidos de la liga de fútbol. La mecánica es muy sencilla:

– Los equipos serán insertados en la cola.

– Los árbitros en la pila.

– Por cada árbitro extraído, se extraerán dos equipos, indicando qué árbitro corresponde a cada equipo (programa Principal).

Comprobar resultados y que sean correctos teniendo en cuenta los gráficos anteriores

Nota: es necesaria la implementación de todos los métodos de la interfaz Pila<E>, en caso contrario, dará error de compilación

La siguiente semana os daremos la solución a este ejercicio de forma detallada y comprobando los resultados, además de emplazaros para la temática de nuestra próxima entrega


Noticias relacionadas