// Classe PileTableau utilisant un tableau pour stocker les éléments
public class PileTableau<E> implements Pile<E> {
    private static final int INITIAL_CAPACITY = 10;
    private E[] elements;
    private int size = 0;

    @SuppressWarnings("unchecked")
    public PileTableau() {
        elements = (E[]) new Object[INITIAL_CAPACITY]; // Création du tableau initial
    }

    @Override
    public void push(E element) {
        ensureCapacity(); // Redimensionne si nécessaire
        elements[size++] = element; // Ajoute l'élément en haut de la pile
    }

    @Override
    public E pop() {
        if (isEmpty()) {
            throw new IllegalStateException("La pile est vide");
        }
        E element = elements[--size]; // Récupère l'élément en haut de la pile
        elements[size] = null; // Supprime la référence pour éviter les fuites de mémoire
        return element;
    }

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

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

    // Redimensionne le tableau si nécessaire
    private void ensureCapacity() {
        if (size == elements.length) {
            @SuppressWarnings("unchecked")
            E[] newElements = (E[]) new Object[elements.length * 2]; // Double la capacité
            System.arraycopy(elements, 0, newElements, 0, elements.length);
            elements = newElements;
        }
    }
}
