// Classe PileChainee utilisant une liste chaînée pour stocker les éléments
public class PileChainee<E> implements Pile<E> {
    private static class Node<E> {
        E data;
        Node<E> next;

        Node(E data) {
            this.data = data;
        }
    }

    private Node<E> top;  // Le sommet de la pile
    private int size = 0; // Taille de la pile

    @Override
    public void push(E element) {
        Node<E> newNode = new Node<>(element);
        newNode.next = top; // Le nouvel élément pointe vers l'ancien sommet
        top = newNode;      // Le nouvel élément devient le sommet de la pile
        size++;
    }

    @Override
    public E pop() {
        if (isEmpty()) {
            throw new IllegalStateException("La pile est vide");
        }
        E data = top.data; // Récupère la donnée du sommet
        top = top.next;    // Le sommet devient l'élément suivant
        size--;
        return data;
    }

    @Override
    public int size() {
        return size;
    }

    @Override
    public boolean isEmpty() {
        return size == 0;
    }
}
