Ce face Deque
Deque („double-ended queue”, se citește „deck”) permite operații la ambele capete: offerFirst/offerLast adaugă, pollFirst/pollLast scot, peekFirst/peekLast doar privesc. Ca și la Queue, există și variante cu excepții: addFirst, removeFirst, getFirst etc.
Un Deque poate fi folosit ca stivă (LIFO, ultimul intrat iese primul) cu push, pop, peek, toate la început. Este înlocuitorul recomandat pentru vechea clasă Stack. Folosit ca Queue, offer adaugă la sfârșit și poll scoate de la început.
Implementările obișnuite sunt ArrayDeque (rapidă, recomandată) și LinkedList.
Parametri
| Parametru | Descriere |
|---|---|
T |
Tipul elementelor. |
Ce returnează
Un obiect care implementează Deque.
Exemple
Exemplul 1: Operații la ambele capete
import java.util.ArrayDeque;
import java.util.Deque;
public class Main {
public static void main(String[] args) {
Deque<String> tren = new ArrayDeque<>();
tren.offerLast("vagon 1");
tren.offerLast("vagon 2");
tren.offerFirst("locomotivă");
tren.offerLast("vagon de marfă");
System.out.println(tren);
System.out.println("Primul: " + tren.peekFirst() + ", ultimul: " + tren.peekLast());
tren.pollLast();
System.out.println("Fără ultimul: " + tren);
}
}
Rezultat
[locomotivă, vagon 1, vagon 2, vagon de marfă]
Primul: locomotivă, ultimul: vagon de marfă
Fără ultimul: [locomotivă, vagon 1, vagon 2]
Exemplul 2: Este palindrom?
Scoatem câte o literă din fiecare capăt și le comparăm.
import java.util.ArrayDeque;
import java.util.Deque;
public class Main {
static boolean palindrom(String text) {
Deque<Character> d = new ArrayDeque<>();
for (char c : text.toLowerCase().toCharArray()) {
if (Character.isLetter(c)) {
d.offerLast(c);
}
}
while (d.size() > 1) {
if (!d.pollFirst().equals(d.pollLast())) {
return false;
}
}
return true;
}
public static void main(String[] args) {
System.out.println(palindrom("Ele fac cafele"));
System.out.println(palindrom("Iași"));
}
}
Rezultat
true
false
Greșeli frecvente
- Folosești clasa veche
Stack. E mai lentă (sincronizată) și moștenește dinVector; foloseșteDeque<T> stiva = new ArrayDeque<>(). - Amesteci
push(la început) cuoffer(la sfârșit) pe același obiect fără să știi asta. Elementele nu ies în ordinea așteptată.
Comenzi înrudite
ArrayDeque: Implementarea recomandată pentru cozi și stive: un array circular care crește automat, rapid la ambele capete.Deque.push: Folosește un Deque ca stivă: push pune un element deasupra, pop îl scoate pe cel de deasupra, peek îl arată fără să-l scoată.Deque.offerFirst: offerFirst adaugă un element la începutul unui Deque, offerLast la sfârșit. Returnează true dacă a reușit.Deque.pollFirst: pollFirst și pollLast scot primul sau ultimul element dintr-un Deque; peekFirst și peekLast doar îl arată. Pe gol dau null.Queue: Interfața pentru cozi: elementele intră la coadă și ies din față, în ordinea sosirii (FIFO), ca la ghișeu.LinkedList: Listă dublu înlănțuită: adăugare și ștergere rapide la ambele capete; implementează și List, și Deque.