Cabana_Mario_Ariel_F

Queque.

Oct 7th, 2020 (edited)
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.21 KB | None | 0 0
  1. //
  2. // Created by Julio Tentor <jtentor@fi.unju.edu.ar>
  3. // Modificado y Traducido al Español por Mario Ariel Fernando Cabana <42268639@fi.unju.edu.ar>
  4. //
  5.  
  6. /*
  7. public interface Queue<E>
  8. extends Collection<E>
  9.  
  10. Una colección diseñada a contener elementos antes de su procesamiento.
  11. Ademas de una colección con operaciones basicas, las colas proveen un encaje adicional
  12. extracciones, y operaciones de inspección. Cada uno de esos metodos se presentan en
  13. dos formas: uno arroja una excepción en caso de que la operación falle, la otra
  14. retorna un valor especial (ya sea nulo o falso, dependiendo de la operación).
  15.  
  16. La forma mas tardia de insertar una operación es designandola especificamente por uso
  17. con implementaciones de cola de capacidad restringida; en cuanto más implementaciones,
  18. las operaciones de inserción no podran fallar.
  19.  
  20. Las Colas tipicamente, pero no necesariamente, ordenan sus elementos por medio
  21. de FIFO (first-in-first-out). Al rededor de excepciones que son prioridad de la cola,
  22. las cuales ordenan los elementos de acuerdo a un comparador suministrado, u el ordenamiento natural
  23. de los elementos, y colas LIFO (o pilas) las cuales ordenan los elementos en
  24. LIFO (last-in-first-out). Sea cual sea el ordenamiento usado, la cabeza de la cola
  25. es el elemnto que podria ser removido por un llamado a remove() o poll().
  26. Dado una cola FIFO, todo nuevo elemento es insertado en la cola, tail, de la cola.
  27. Otro tipo de colas pueden usar diferentes reglas de colocación.
  28. Cada implementación de cola debe especificar estas propiedades de ordenamiento.
  29.  
  30. EL metodo Offer inserta un elemento si es posible, de otro modo este retorna
  31. falso. Estas difieren del metodo Collection.add, el cual puede fallar para
  32. agregar un elemento solo por un arrojamiento de una excepción inespecificada. El metodo offer
  33. esta designado para usarse cuando una falla es normal, más que una ocurrencia
  34. excepcional, por ejemplo, en colas fixed-capacity (o "bounded").
  35.  
  36. Los metodos remove() y poll() remueven y retornan la cabeza de la cola.
  37. Precisamente este elemento es removido de la cola es una función de la
  38. norma de ordenamiento cola, el mismo difiere de la implementación to
  39. implementation. Los metodos remove() y poll() difieren solo en su
  40. comportamiento cuando la cola se encuentra vacia: the remove() arroja una
  41. excepción, mientras que poll() retorna null.
  42.  
  43. Los metodos element() and peek() retornan, pero no remueven, la cabeza de
  44. la cola.
  45.  
  46. La interfaz de la cola no define el bloqueo de sus metodos, los cuales
  47. son comunes el la programación concurrida. estos metodos, esperan por
  48. elementos a aparecer o por espacios que estaran disponibles, estas son definidas
  49. en la interfaz BlockingQueue, que extiende esta interfaz.
  50.  
  51. Las implementaciones de la cola generalmente no permiten la inserción de elemento nulos,
  52. asi tambien como alguna impleentacion, como ser LinkedList, no permiten la insercion de
  53. nulos. Aun que en implementaciones que lo permiten, el nulo no debe ser insertado en la cola,
  54. como nulo tambien es usado un valor de retorno especial por el metodoo poll que indica
  55. que la cola contiene no elementos.
  56.  
  57. Las implementaciones de la cola generalmente no definen elemento-basado en versiones de
  58. metodos iguales y hashCode pero mas alla de eso e inherente la identidad basada en
  59. versiones de clase Object, porque la igualdad del elemento-basado no es
  60. siempre bien definida por colas con el mismo elemento pero diferente ordenamiento
  61. de propiedades.
  62.  
  63. esta interfaz es un miembro de the Java Collections Framework.
  64.  
  65.  
  66.  
  67. from https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/util/Queue.html
  68. from https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/util/Queue.html
  69. from https://docs.oracle.com/en/java/javase/15/docs/api/java.base/java/util/Queue.html
  70.  
  71.  */
  72.  
  73.  
  74. import java.util.Arrays;
  75.  
  76. public class Cola<T> {
  77.  
  78.     //region Constantes
  79.  
  80.     private final static Integer defaulDimension = 10;
  81.  
  82.     //endregion
  83.  
  84.     //region Atributos
  85.  
  86.     private T [] data;
  87.     private int head;
  88.     private int tail;
  89.     private int count;
  90.  
  91.     //endregion
  92.  
  93.     //region Constructores
  94.  
  95.     public Cola() {
  96.         this(Cola.defaulDimension);
  97.     }
  98.     public Cola(int dimension) {
  99.         this.data = (T[]) new Object[dimension];
  100.         this.head = 0;
  101.         this.tail = 0;
  102.         this.count = 0;
  103.     }
  104.     //endregion
  105.  
  106.     //region Metodos Internos de la Cola
  107.     private int next(int pos) {
  108.         if (++pos >= this.data.length) {
  109.             pos = 0;
  110.         }
  111.         return pos;
  112.     }
  113.     //endregion
  114.  
  115.  
  116.     //region Metodos de la Cola
  117.  
  118.     // Operación EnQueue en la teoría de Estructura de Datos
  119.     //
  120.     // Inserta un elemento especificado en la cola si esto es posible de hacer entonces
  121.     // inmediatamente sin violar las restricciones, retorna verdadero sobre
  122.     // el exito y arroja una IllegalStateException si no hay espacio concurrentemente
  123.     // disponible.
  124.     public boolean add(T element) {
  125.  
  126.         if (this.size() >= this.data.length) {
  127.             throw new IllegalStateException("Cola llena ...");
  128.         }
  129.  
  130.         this.data[this.tail] = element;
  131.         this.tail = this.next(this.tail);
  132.         ++this.count;
  133.  
  134.         return true;
  135.     }
  136.  
  137.     // Operación peek en la teoría de Estructura de Datos
  138.     //
  139.     // Recupera, pero no remueve, la cabeza de la cola. Este difiere del peek
  140.     // solo en que este arroja una excepción si la cola esta vacia.
  141.     public T element() {
  142.  
  143.         if (this.size() <= 0) {
  144.             throw new IllegalStateException("Cola vacía ...");
  145.         }
  146.  
  147.         return this.data[this.head];
  148.     }
  149.  
  150.     // Operación EnQueue en la teoría de Estructura de Datos
  151.     //
  152.     // Inserta un elemento especificado en la cola si si esto es posible de hacer entonces
  153.     // inmediatamente sin violar las restricciones. Cuando se usa una
  154.     // capacidad-restringidad en cola, este metodo prefiere generalmente agregar (E),
  155.     // el cual puede fallar al insertar un elemento solo por arrojar una excepción.
  156.     public boolean offer(T element) {
  157.  
  158.         if (this.size() >= this.data.length) {
  159.             return false;
  160.         }
  161.  
  162.         this.data[this.tail] = element;
  163.         this.tail = this.next(this.tail);
  164.         ++this.count;
  165.  
  166.         return true;
  167.     }
  168.  
  169.     // Recupera, pero no remueve, la cabeza de la cola, o retorna nulo si
  170.     // la cola esta vacia.
  171.     public T peek() {
  172.         if (this.size() <= 0) {
  173.             return null;
  174.         }
  175.  
  176.         return this.data[this.head];
  177.     }
  178.  
  179.     // Operación DeQueue en la teoría de Estructura de Datos
  180.     //
  181.     // Recupera y remueve la cabeza de la cola, o retorna nulo si la cola
  182.     // esta vacia.
  183.     public T pool() {
  184.         if (this.size() <= 0) {
  185.             return null;
  186.         }
  187.  
  188.         T result = this.data[this.head];
  189.         this.head = this.next(this.head);
  190.         --this.count;
  191.  
  192.         return result;
  193.     }
  194.  
  195.     // Operación DeQueue en la teoría de Estructura de Datos
  196.     //
  197.     // Recupera y remueve la cabeza de la cola. Este difiere del poll()
  198.     // solo en que este arroja una excepción si la cola esta vacia.
  199.     public T remove() {
  200.         if (this.size() <= 0) {
  201.             throw new IllegalStateException("Cola vacía ...");
  202.         }
  203.  
  204.         T result = this.data[this.head];
  205.         this.head = this.next(this.head);
  206.         --this.count;
  207.  
  208.         return result;
  209.     }
  210.     //endregion
  211.  
  212.  
  213.     //region Override Object basic methods
  214.  
  215.     @Override
  216.     public String toString() {
  217.  
  218.         if (this.size() <=0) {
  219.             return "";
  220.         }
  221.  
  222.         // from https://docs.oracle.com/en/java/javase/15/docs/api/java.base/java/lang/StringBuilder.html
  223.         StringBuilder sb = new StringBuilder();
  224.         sb.append("[" + this.data[this.head].toString());
  225.  
  226.         for (int cta = 1, pos = this.next(this.head); cta < this.size(); ++cta, pos = this.next(pos)) {
  227.             sb.append(", " + this.data[pos].toString());
  228.         }
  229.  
  230.         sb.append("]");
  231.         return sb.toString();
  232.     }
  233.     //endregion
  234.  
  235.  
  236.     //region Metodos de la Colleccion
  237.  
  238.     public boolean isEmpty() {
  239.         return this.count <= 0;
  240.     }
  241.  
  242.     public int size() {
  243.         return this.count;
  244.     }
  245.  
  246.     public Object[] toArray() {
  247.         Object[] result = new Object[this.count];
  248.         for(int i = 0, pos = this.head, cta = this.size(); cta > 0; ++i, pos = this.next(pos), --cta) {
  249.             result[i] = this.data[pos];
  250.         }
  251.         return result;
  252.     }
  253.     //endregion
  254.  
  255.  
  256.     //region Caso Ejemplo b) Methods
  257.  
  258.     public static Cola<Object> union(Cola<?> stack1, Cola<?> stack2) {
  259.  
  260.         Cola<Object> result = new Cola<Object>(stack1.size() + stack2.size());
  261.  
  262.         for(int pos = stack1.head, cta = stack1.size(); cta > 0; pos = stack1.next(pos), --cta) {
  263.             result.offer( stack1.data[pos] );
  264.         }
  265.         for(int pos = stack2.head, cta = stack2.size(); cta > 0; pos = stack2.next(pos), --cta) {
  266.             result.offer( stack2.data[pos] );
  267.         }
  268.  
  269.         return result;
  270.     }
  271.  
  272.     public Cola<Object> union(Cola<?> stack2) {
  273.         return Cola.union(this, stack2);
  274.     }
  275.     //endregion
  276.  
  277. }
  278.  
Add Comment
Please, Sign In to add comment