Deque
Fila de duas pontas
Este capítulo não será muito longo; ele irá expandir o anterior. Deque
, ou fila de duas pontas, ajuda a trabalhar com filas tanto pela frente quanto por trás.
A interface Deque
estende a interface Queue
, então uma classe como LinkedList
também implementa esta interface (estou impressionado com a versatilidade do LinkedList
). Portanto, usaremos novamente o LinkedList
, mas desta vez com uma nova interface.
Declarando um objeto com o tipo Deque
não é diferente de Queue
:
main.java
1Deque<T> deque = new LinkedList<>();
A principal diferença surge quando passamos para os métodos desta interface. Como um Deque
é uma fila de duas pontas, o que significa que você pode trabalhar com elementos tanto na frente quanto no final da fila, seus métodos são adaptados a essa característica.
Métodos
Alguns métodos chave da interface Deque
são:
addFirst(element)
: Adiciona um elemento ao início do deque.addLast(element)
: Adiciona um elemento ao fim do deque.
Evidentemente, em um deque, haveria métodos para adicionar tanto no começo quanto no fim. Os nomes desses métodos são autoexplicativos.
Vamos dar uma olhada nesses métodos em código:
main.java
123456789101112131415package com.example; import java.util.Deque; import java.util.LinkedList; public class Main { public static void main(String[] args) { Deque<String> deque = new LinkedList<>(); deque.addFirst("One"); deque.addLast("Two"); System.out.println("Deque: " + deque); deque.addFirst("Zero"); System.out.println("Deque after the `addFirst()` method: " + deque); } }
Como você pode ver, após utilizar o método addFirst()
, o elemento foi adicionado ao início do deque. Isso o diferencia do método addLast()
.
O Deque também possui um método regular add()
, que funciona da mesma forma que o método addLast()
. Portanto, escolher qual método utilizar fica a seu critério.
Vamos em frente!
Métodos de Remoção
Se existem métodos para adicionar elementos ao início e ao fim, também devem existir métodos para remover do início e do fim da deque.
removeFirst()
: Remove e retorna o elemento do início da deque.removeLast()
: Remove e retorna o elemento do fim da deque.
Os métodos addFirst()
e addLast()
realizam a remoção de elementos do início e do fim da deque. Vamos dar uma olhada em um exemplo de uso no código:
main.java
1234567891011121314151617package com.example; import java.util.Deque; import java.util.LinkedList; public class Main { public static void main(String[] args) { Deque<String> deque = new LinkedList<>(); deque.add("One"); deque.add("Second"); deque.add("Third"); System.out.println("Deque: " + deque); deque.removeFirst(); deque.removeLast(); System.out.println("Deque after the removal methods method: " + deque); } }
Como você pode ver, removemos o primeiro e o último elemento do deque, deixando apenas o segundo elemento. É simples e prático, e os nomes dos métodos são autoexplicativos.
Nota
Para garantir que seu programa e métodos sejam igualmente compreensíveis, vale a pena dar a eles nomes claros. O nome de uma variável/método/classe deve indicar o que aquele método faz. Tente evitar nomes como "
a
," "var1
/var2
," e assim por diante. Com essa abordagem na escrita do código, será muito mais fácil para você trabalhar com seus próprios métodos.
Métodos de recuperação
A seguir, vamos aos métodos de recuperação de elementos do deque.
getFirst()
: Retorna, mas não remove, o elemento do início do deque.getLast()
: Retorna, mas não remove, o elemento do final do deque.
Podemos acessar os primeiros e últimos elementos em tal fila de duas extremidades. Vamos ver tradicionalmente a implementação no código:
main.java
123456789101112131415161718package com.example; import java.util.Deque; import java.util.LinkedList; public class Main { public static void main(String[] args) { Deque<String> deque = new LinkedList<>(); deque.add("One"); deque.add("Second"); deque.add("Third"); System.out.println("Deque: " + deque); String first = deque.getFirst(); String last = deque.getLast(); System.out.println("The first element in the deque: " + first); System.out.println("The last element in the deque: " + last); } }
Usando os métodos getFirst()
e getLast()
, recuperamos os primeiros e últimos elementos do deque e atribuímos a variáveis recém-criadas.
Na interface Deque
, também existem os métodos peekFirst()
e peekLast()
, que abordam a questão do lançamento de exceção. Ao invés de lançarem uma exceção e interromperem o programa, eles retornam null
se a fila estiver vazia.
Vamos ver um exemplo:
main.java
123456789101112131415package com.example; import java.util.Deque; import java.util.LinkedList; public class Main { public static void main(String[] args) { Deque<String> deque = new LinkedList<>(); System.out.println("Deque: " + deque); String first = deque.peekFirst(); System.out.println("The first element in the deque: " + first); String last = deque.getLast(); System.out.println("The last element in the deque: " + last); } }
Neste exemplo, tornou-se evidente que é muito melhor utilizar os métodos peekFirst()
e peekLast()
ao invés de usar os métodos getFirst()
e getLast()
, pois eles não interromperão o programa em caso de erro.
No entanto, não se esqueça do NullPointerException
! Esta exceção pode causar muitos problemas no seu programa.
Existem também métodos alternativos equivalentes para os métodos addFirst()
, addLast()
, removeFirst()
e removeLast()
. Não vamos nos aprofundar neles por muito tempo, já que você já entende o princípio de como esses métodos funcionam, mas aqui está a lista:
Métodos alternativos
Métodos para adicionar um elemento ao início da fila dupla:
offerFirst(E e)
: Adiciona um elemento ao início da fila dupla, se possível, e retornatrue
. Retornafalse
se a adição não for possível.offerLast(E e)
: Adiciona um elemento ao fim da fila dupla, se possível, e retornatrue
. Retornafalse
se a adição não for possível.push(E e)
: Adiciona um elemento ao início da fila dupla, similar aaddFirst()
. Note quepush()
também é um método de pilha na classeDeque
.
Métodos para remover um elemento do início da fila dupla:
pollFirst()
: Remove e retorna o primeiro elemento da fila dupla. Retornanull
se a fila dupla estiver vazia.pollLast()
: Remove e retorna o último elemento da fila dupla. Retornanull
se a fila dupla estiver vazia.pop()
: Remove e retorna o primeiro elemento da fila dupla, similar aremoveFirst()
.
Cobrimos os métodos principais. Se você vai usar Queue
ou Deque
fica inteiramente a seu critério.
A escolha depende dos requisitos do programa. Você sempre pode resolver tudo com um array regular, mas seria bastante desafiador, e eu não acho que seria otimizado. É por isso que tantas estruturas de dados diferentes são criadas exclusivamente pela conveniência de escrever vários programas.
No próximo capítulo, vamos colocar filas em prática, e você verá quão convenientes elas são para trabalhar no contexto certo.
1. Pergunta: O que significa "Deque"?
2. Qual interface em Java representa uma Deque?
3. Qual é o propósito do método addFirst()
em uma Deque?
4. Qual método é usado para recuperar, mas não remover, o último elemento de um Deque?
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo
Awesome!
Completion rate improved to 4
Deque
Deslize para mostrar o menu
Fila de duas pontas
Este capítulo não será muito longo; ele irá expandir o anterior. Deque
, ou fila de duas pontas, ajuda a trabalhar com filas tanto pela frente quanto por trás.
A interface Deque
estende a interface Queue
, então uma classe como LinkedList
também implementa esta interface (estou impressionado com a versatilidade do LinkedList
). Portanto, usaremos novamente o LinkedList
, mas desta vez com uma nova interface.
Declarando um objeto com o tipo Deque
não é diferente de Queue
:
main.java
1Deque<T> deque = new LinkedList<>();
A principal diferença surge quando passamos para os métodos desta interface. Como um Deque
é uma fila de duas pontas, o que significa que você pode trabalhar com elementos tanto na frente quanto no final da fila, seus métodos são adaptados a essa característica.
Métodos
Alguns métodos chave da interface Deque
são:
addFirst(element)
: Adiciona um elemento ao início do deque.addLast(element)
: Adiciona um elemento ao fim do deque.
Evidentemente, em um deque, haveria métodos para adicionar tanto no começo quanto no fim. Os nomes desses métodos são autoexplicativos.
Vamos dar uma olhada nesses métodos em código:
main.java
123456789101112131415package com.example; import java.util.Deque; import java.util.LinkedList; public class Main { public static void main(String[] args) { Deque<String> deque = new LinkedList<>(); deque.addFirst("One"); deque.addLast("Two"); System.out.println("Deque: " + deque); deque.addFirst("Zero"); System.out.println("Deque after the `addFirst()` method: " + deque); } }
Como você pode ver, após utilizar o método addFirst()
, o elemento foi adicionado ao início do deque. Isso o diferencia do método addLast()
.
O Deque também possui um método regular add()
, que funciona da mesma forma que o método addLast()
. Portanto, escolher qual método utilizar fica a seu critério.
Vamos em frente!
Métodos de Remoção
Se existem métodos para adicionar elementos ao início e ao fim, também devem existir métodos para remover do início e do fim da deque.
removeFirst()
: Remove e retorna o elemento do início da deque.removeLast()
: Remove e retorna o elemento do fim da deque.
Os métodos addFirst()
e addLast()
realizam a remoção de elementos do início e do fim da deque. Vamos dar uma olhada em um exemplo de uso no código:
main.java
1234567891011121314151617package com.example; import java.util.Deque; import java.util.LinkedList; public class Main { public static void main(String[] args) { Deque<String> deque = new LinkedList<>(); deque.add("One"); deque.add("Second"); deque.add("Third"); System.out.println("Deque: " + deque); deque.removeFirst(); deque.removeLast(); System.out.println("Deque after the removal methods method: " + deque); } }
Como você pode ver, removemos o primeiro e o último elemento do deque, deixando apenas o segundo elemento. É simples e prático, e os nomes dos métodos são autoexplicativos.
Nota
Para garantir que seu programa e métodos sejam igualmente compreensíveis, vale a pena dar a eles nomes claros. O nome de uma variável/método/classe deve indicar o que aquele método faz. Tente evitar nomes como "
a
," "var1
/var2
," e assim por diante. Com essa abordagem na escrita do código, será muito mais fácil para você trabalhar com seus próprios métodos.
Métodos de recuperação
A seguir, vamos aos métodos de recuperação de elementos do deque.
getFirst()
: Retorna, mas não remove, o elemento do início do deque.getLast()
: Retorna, mas não remove, o elemento do final do deque.
Podemos acessar os primeiros e últimos elementos em tal fila de duas extremidades. Vamos ver tradicionalmente a implementação no código:
main.java
123456789101112131415161718package com.example; import java.util.Deque; import java.util.LinkedList; public class Main { public static void main(String[] args) { Deque<String> deque = new LinkedList<>(); deque.add("One"); deque.add("Second"); deque.add("Third"); System.out.println("Deque: " + deque); String first = deque.getFirst(); String last = deque.getLast(); System.out.println("The first element in the deque: " + first); System.out.println("The last element in the deque: " + last); } }
Usando os métodos getFirst()
e getLast()
, recuperamos os primeiros e últimos elementos do deque e atribuímos a variáveis recém-criadas.
Na interface Deque
, também existem os métodos peekFirst()
e peekLast()
, que abordam a questão do lançamento de exceção. Ao invés de lançarem uma exceção e interromperem o programa, eles retornam null
se a fila estiver vazia.
Vamos ver um exemplo:
main.java
123456789101112131415package com.example; import java.util.Deque; import java.util.LinkedList; public class Main { public static void main(String[] args) { Deque<String> deque = new LinkedList<>(); System.out.println("Deque: " + deque); String first = deque.peekFirst(); System.out.println("The first element in the deque: " + first); String last = deque.getLast(); System.out.println("The last element in the deque: " + last); } }
Neste exemplo, tornou-se evidente que é muito melhor utilizar os métodos peekFirst()
e peekLast()
ao invés de usar os métodos getFirst()
e getLast()
, pois eles não interromperão o programa em caso de erro.
No entanto, não se esqueça do NullPointerException
! Esta exceção pode causar muitos problemas no seu programa.
Existem também métodos alternativos equivalentes para os métodos addFirst()
, addLast()
, removeFirst()
e removeLast()
. Não vamos nos aprofundar neles por muito tempo, já que você já entende o princípio de como esses métodos funcionam, mas aqui está a lista:
Métodos alternativos
Métodos para adicionar um elemento ao início da fila dupla:
offerFirst(E e)
: Adiciona um elemento ao início da fila dupla, se possível, e retornatrue
. Retornafalse
se a adição não for possível.offerLast(E e)
: Adiciona um elemento ao fim da fila dupla, se possível, e retornatrue
. Retornafalse
se a adição não for possível.push(E e)
: Adiciona um elemento ao início da fila dupla, similar aaddFirst()
. Note quepush()
também é um método de pilha na classeDeque
.
Métodos para remover um elemento do início da fila dupla:
pollFirst()
: Remove e retorna o primeiro elemento da fila dupla. Retornanull
se a fila dupla estiver vazia.pollLast()
: Remove e retorna o último elemento da fila dupla. Retornanull
se a fila dupla estiver vazia.pop()
: Remove e retorna o primeiro elemento da fila dupla, similar aremoveFirst()
.
Cobrimos os métodos principais. Se você vai usar Queue
ou Deque
fica inteiramente a seu critério.
A escolha depende dos requisitos do programa. Você sempre pode resolver tudo com um array regular, mas seria bastante desafiador, e eu não acho que seria otimizado. É por isso que tantas estruturas de dados diferentes são criadas exclusivamente pela conveniência de escrever vários programas.
No próximo capítulo, vamos colocar filas em prática, e você verá quão convenientes elas são para trabalhar no contexto certo.
1. Pergunta: O que significa "Deque"?
2. Qual interface em Java representa uma Deque?
3. Qual é o propósito do método addFirst()
em uma Deque?
4. Qual método é usado para recuperar, mas não remover, o último elemento de um Deque?
Obrigado pelo seu feedback!