Deque în Java

Coadă cu două capete: adaugi și scoți atât la început, cât și la sfârșit. Se folosește și ca stivă, și ca coadă.

Sintaxă
import java.util.Deque;
import java.util.ArrayDeque;

Deque<T> d = new ArrayDeque<>();

// la început        // la sfârșit
offerFirst(e)        offerLast(e)
pollFirst()          pollLast()
peekFirst()          peekLast()

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 din Vector; folosește Deque<T> stiva = new ArrayDeque<>().
  • Amesteci push (la început) cu offer (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.