Contenido del Curso
Java Data Structures
2. Estructuras de Datos Adicionales
Java Data Structures
Cola con doble extremo
Cola doble
Este capítulo no será muy largo; ampliará el anterior. Deque
, o cola de doble extremo, ayuda a trabajar con colas tanto por delante como por detrás.
Deque
interface extends the Queue
interface and represents a double-ended queue, where elements can be added and retrieved from both the front and the back.
La interfaz Deque
extiende la interfaz Queue
, por lo que una clase como LinkedList
también implementa esta interfaz (me sorprende lo versátil que es LinkedList
). Por lo tanto, usaremos de nuevo LinkedList
, pero esta vez con una nueva interfaz.
Declarar un objeto con el tipo Deque
no es diferente de Queue
:
main.java
La diferencia principal entra en juego cuando pasamos a los métodos de esta interfaz. Dado que Deque
es una cola de doble extremo, lo que significa que puedes trabajar con elementos tanto al principio como al final de la cola, sus métodos están adaptados a esta característica.
Métodos
Algunos métodos clave de la interfaz Deque
son:
addFirst(elemento)
: Añade un elemento al principio del deque.addLast(elemento)
: Añade un elemento al final del deque.
Evidentemente, en un deque habría métodos para añadir al principio y al final. Los nombres de estos métodos son autoexplicativos.
Veamos estos métodos en código:
main.java
Como puede ver, después de usar el método addFirst()
, el elemento se añadió al principio del deque. Esto lo distingue del método addLast()
.
Deque también tiene un método regular add()
, que funciona igual que el método addLast()
. Por lo tanto, la elección del método a utilizar es totalmente suya.
Sigamos.
Métodos de eliminación
Si hay métodos para añadir elementos al principio y al final, también debería haber métodos para eliminar del principio y del final del deque.
- EliminarPrimero()`: Elimina y devuelve el elemento del principio del deque.
- EliminarÚltimo()`: Elimina y devuelve el elemento del final del deque.
Los métodos addFirst()
y addLast()
realizan la eliminación de elementos del principio y del final del deque. Veamos un ejemplo de uso en el código:
main.java
Como puedes ver, hemos eliminado el primer y el último elemento del deque, dejando sólo el segundo elemento. Es simple y conveniente, y los nombres de los métodos hablan por sí mismos.
Nota
Para asegurarte de que tu programa y tus métodos son igualmente comprensibles, vale la pena darles nombres claros. El nombre de una variable/método/clase debe indicar lo que hace ese método. Intenta evitar nombres como "
a
", "var1
/var2
", etc. Con este enfoque a la hora de escribir código, te será mucho más fácil trabajar con tus propios métodos.
Métodos de recuperación
A continuación, pasemos a los métodos de recuperación de elementos del deque.
getPrimero()
: Devuelve, pero no elimina, el elemento del principio del deque.getLast()
: Devuelve, pero no elimina, el elemento del final del deque.
Podemos acceder al primer y último elemento de una cola de doble extremo. Veamos tradicionalmente la implementación en el código:
main.java
Usando los métodos getFirst()
y getLast()
, recuperamos el primer y último elemento del deque y los asignamos a variables recién creadas.
En la interfaz Deque
, también existen los métodos peekFirst()
y peekLast()
, que tratan el problema de lanzar una excepción. En lugar de lanzar una excepción y detener el programa, devuelven null
si la cola está vacía.
Veamos un ejemplo:
main.java
A partir de este ejemplo, se hizo evidente que es mucho mejor usar los métodos peekFirst()
y peekLast()
en lugar de usar los métodos getFirst()
y getLast()
, ya que no detendrán el programa en caso de error.
Sin embargo, ¡no te olvides de la excepción NullPointerException
! Esta excepción puede causar muchos problemas en tu programa.
También existen métodos alternativos equivalentes para los métodos addFirst()
, addLast()
, removeFirst()
, y removeLast()
. No nos detendremos en ellos durante mucho tiempo, ya que usted ya entiende el principio de cómo funcionan estos métodos, pero aquí está la lista:
Métodos alternativos
Métodos para añadir un elemento al principio del deque:
offerFirst(E e)
: Añade un elemento al principio del deque, si es posible, y devuelvetrue
. Si no es posible, devuelvefalse
.offerFirst(E e)
: Añade un elemento al final del deque, si es posible, y devuelvetrue
. Devuelvefalse
si la suma no es posible.- empujar(E e)
: Añade un elemento al principio del deque, de forma similar a
addFirst(). Ten en cuenta que
push()es también un método de pila en la clase
Deque`.
Métodos para eliminar un elemento del principio del deque:
pollFirst()
: Elimina y devuelve el primer elemento del deque. Devuelvenull
si el deque está vacío.pollFirst()
: Elimina y devuelve el último elemento del deque. Devuelvenull
si el deque está vacío.- pop()
: Elimina y devuelve el primer elemento del deque, similar a
removeFirst()`.
Hemos cubierto los métodos principales. Usar Queue
o Deque
depende de ti.
La elección depende de las necesidades del programa. Siempre se puede resolver todo con un array regular, pero sería todo un reto, y no creo que estuviera optimizado. Por eso se han creado tantas estructuras de datos diferentes, sólo para facilitar la escritura de distintos programas.
En el próximo capítulo, pondremos en práctica las colas, y verás lo conveniente que es trabajar con ellas en el contexto adecuado.
¿Todo estuvo claro?
Contenido del Curso
Java Data Structures
2. Estructuras de Datos Adicionales
Java Data Structures
Cola con doble extremo
Cola doble
Este capítulo no será muy largo; ampliará el anterior. Deque
, o cola de doble extremo, ayuda a trabajar con colas tanto por delante como por detrás.
Deque
interface extends the Queue
interface and represents a double-ended queue, where elements can be added and retrieved from both the front and the back.
La interfaz Deque
extiende la interfaz Queue
, por lo que una clase como LinkedList
también implementa esta interfaz (me sorprende lo versátil que es LinkedList
). Por lo tanto, usaremos de nuevo LinkedList
, pero esta vez con una nueva interfaz.
Declarar un objeto con el tipo Deque
no es diferente de Queue
:
main.java
La diferencia principal entra en juego cuando pasamos a los métodos de esta interfaz. Dado que Deque
es una cola de doble extremo, lo que significa que puedes trabajar con elementos tanto al principio como al final de la cola, sus métodos están adaptados a esta característica.
Métodos
Algunos métodos clave de la interfaz Deque
son:
addFirst(elemento)
: Añade un elemento al principio del deque.addLast(elemento)
: Añade un elemento al final del deque.
Evidentemente, en un deque habría métodos para añadir al principio y al final. Los nombres de estos métodos son autoexplicativos.
Veamos estos métodos en código:
main.java
Como puede ver, después de usar el método addFirst()
, el elemento se añadió al principio del deque. Esto lo distingue del método addLast()
.
Deque también tiene un método regular add()
, que funciona igual que el método addLast()
. Por lo tanto, la elección del método a utilizar es totalmente suya.
Sigamos.
Métodos de eliminación
Si hay métodos para añadir elementos al principio y al final, también debería haber métodos para eliminar del principio y del final del deque.
- EliminarPrimero()`: Elimina y devuelve el elemento del principio del deque.
- EliminarÚltimo()`: Elimina y devuelve el elemento del final del deque.
Los métodos addFirst()
y addLast()
realizan la eliminación de elementos del principio y del final del deque. Veamos un ejemplo de uso en el código:
main.java
Como puedes ver, hemos eliminado el primer y el último elemento del deque, dejando sólo el segundo elemento. Es simple y conveniente, y los nombres de los métodos hablan por sí mismos.
Nota
Para asegurarte de que tu programa y tus métodos son igualmente comprensibles, vale la pena darles nombres claros. El nombre de una variable/método/clase debe indicar lo que hace ese método. Intenta evitar nombres como "
a
", "var1
/var2
", etc. Con este enfoque a la hora de escribir código, te será mucho más fácil trabajar con tus propios métodos.
Métodos de recuperación
A continuación, pasemos a los métodos de recuperación de elementos del deque.
getPrimero()
: Devuelve, pero no elimina, el elemento del principio del deque.getLast()
: Devuelve, pero no elimina, el elemento del final del deque.
Podemos acceder al primer y último elemento de una cola de doble extremo. Veamos tradicionalmente la implementación en el código:
main.java
Usando los métodos getFirst()
y getLast()
, recuperamos el primer y último elemento del deque y los asignamos a variables recién creadas.
En la interfaz Deque
, también existen los métodos peekFirst()
y peekLast()
, que tratan el problema de lanzar una excepción. En lugar de lanzar una excepción y detener el programa, devuelven null
si la cola está vacía.
Veamos un ejemplo:
main.java
A partir de este ejemplo, se hizo evidente que es mucho mejor usar los métodos peekFirst()
y peekLast()
en lugar de usar los métodos getFirst()
y getLast()
, ya que no detendrán el programa en caso de error.
Sin embargo, ¡no te olvides de la excepción NullPointerException
! Esta excepción puede causar muchos problemas en tu programa.
También existen métodos alternativos equivalentes para los métodos addFirst()
, addLast()
, removeFirst()
, y removeLast()
. No nos detendremos en ellos durante mucho tiempo, ya que usted ya entiende el principio de cómo funcionan estos métodos, pero aquí está la lista:
Métodos alternativos
Métodos para añadir un elemento al principio del deque:
offerFirst(E e)
: Añade un elemento al principio del deque, si es posible, y devuelvetrue
. Si no es posible, devuelvefalse
.offerFirst(E e)
: Añade un elemento al final del deque, si es posible, y devuelvetrue
. Devuelvefalse
si la suma no es posible.- empujar(E e)
: Añade un elemento al principio del deque, de forma similar a
addFirst(). Ten en cuenta que
push()es también un método de pila en la clase
Deque`.
Métodos para eliminar un elemento del principio del deque:
pollFirst()
: Elimina y devuelve el primer elemento del deque. Devuelvenull
si el deque está vacío.pollFirst()
: Elimina y devuelve el último elemento del deque. Devuelvenull
si el deque está vacío.- pop()
: Elimina y devuelve el primer elemento del deque, similar a
removeFirst()`.
Hemos cubierto los métodos principales. Usar Queue
o Deque
depende de ti.
La elección depende de las necesidades del programa. Siempre se puede resolver todo con un array regular, pero sería todo un reto, y no creo que estuviera optimizado. Por eso se han creado tantas estructuras de datos diferentes, sólo para facilitar la escritura de distintos programas.
En el próximo capítulo, pondremos en práctica las colas, y verás lo conveniente que es trabajar con ellas en el contexto adecuado.
¿Todo estuvo claro?