Deque.push în Java

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ă.

Sintaxă
void push(E e)   // pune deasupra (la început)
E pop()          // scoate de deasupra; excepție dacă e goală
E peek()         // arată vârful fără să-l scoată; null dacă e goală

Ce face Deque.push

O stivă (stack) funcționează ca un teanc de farfurii: ultima pusă este prima luată (LIFO). push(x) pune x deasupra, pop() scoate și returnează elementul de deasupra, iar peek() îl returnează fără să-l scoată.

La un Deque, „deasupra” înseamnă începutul: push este addFirst, pop este removeFirst, peek este peekFirst. De aceea println arată vârful stivei primul.

pop() pe o stivă goală aruncă NoSuchElementException, pe când peek() returnează null. Verifică isEmpty() înainte de pop.

Parametri

Parametru Descriere
e Elementul pus pe stivă.

Ce returnează

push: nimic. pop: elementul scos. peek: vârful sau null.

Exemple

Exemplul 1: Anulare (undo) într-un editor

import java.util.ArrayDeque;
import java.util.Deque;

public class Main {
    public static void main(String[] args) {
        Deque<String> undo = new ArrayDeque<>();
        undo.push("scris „Bună”");
        undo.push("scris „ ziua”");
        undo.push("îngroșat titlul");
        System.out.println("Stiva: " + undo);
        System.out.println("Ultima acțiune: " + undo.peek());
        System.out.println("Anulez: " + undo.pop());
        System.out.println("Anulez: " + undo.pop());
        System.out.println("Rămâne: " + undo);
    }
}

Rezultat

Stiva: [îngroșat titlul, scris „ ziua”, scris „Bună”]
Ultima acțiune: îngroșat titlul
Anulez: îngroșat titlul
Anulez: scris „ ziua”
Rămâne: [scris „Bună”]

Exemplul 2: Paranteze corect închise

Fiecare paranteză deschisă intră pe stivă; o paranteză închisă trebuie să se potrivească cu vârful.

import java.util.ArrayDeque;
import java.util.Deque;

public class Main {
    static boolean echilibrat(String expresie) {
        Deque<Character> stiva = new ArrayDeque<>();
        for (char c : expresie.toCharArray()) {
            switch (c) {
                case '(', '[', '{' -> stiva.push(c);
                case ')', ']', '}' -> {
                    if (stiva.isEmpty()) {
                        return false;
                    }
                    char deschis = stiva.pop();
                    if ("([{".indexOf(deschis) != ")]}".indexOf(c)) {
                        return false;
                    }
                }
                default -> { }
            }
        }
        return stiva.isEmpty();
    }

    public static void main(String[] args) {
        System.out.println(echilibrat("(2 + 3) * [4 - {1 + 1}]"));
        System.out.println(echilibrat("(2 + 3]"));
        System.out.println(echilibrat("((1)"));
    }
}

Rezultat

true
false
false

Greșeli frecvente

  • Apelezi pop() pe o stivă goală. Aruncă NoSuchElementException; verifică isEmpty() sau folosește poll().
  • Te aștepți ca push să pună la sfârșit, ca add. Pune la început.

Comenzi înrudite

  • Deque: 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ă.
  • ArrayDeque: Implementarea recomandată pentru cozi și stive: un array circular care crește automat, rapid la ambele capete.
  • Deque.pollFirst: pollFirst și pollLast scot primul sau ultimul element dintr-un Deque; peekFirst și peekLast doar îl arată. Pe gol dau null.
  • Queue.offer: offer pune un element la coada cozii, poll îl scoate pe primul (sau dă null), peek îl arată pe primul fără să-l scoată.