public class Stack { private Node top; // Puntero al tope de la pila private int size; // Tamaño de la pila // Clase interna para el nodo private static class Node { T data; Node next; Node(T data) { this.data = data; this.next = null; } } // Constructor para la pila public Stack() { top = null; size = 0; } // Método para agregar un elemento a la pila public void push(T data) { Node newNode = new Node<>(data); if (isEmpty()) { top = newNode; } else { newNode.next = top; top = newNode; } size++; } // Método para eliminar un elemento de la pila public T pop() { if (isEmpty()) { throw new IllegalStateException("La pila está vacía"); } T data = top.data; top = top.next; size--; return data; } // Método para verificar si la pila está vacía public boolean isEmpty() { return top == null; } // Método para obtener el tamaño de la pila public int size() { return size; } // Método para imprimir los elementos de la pila public void printStack() { Node current = top; while (current != null) { System.out.print(current.data + " "); current = current.next; } System.out.println(); } // Método main para probar la implementación de la pila public static void main(String[] args) { Stack stack = new Stack<>(); stack.push(1); stack.push(2); stack.push(3); System.out.println("Tamaño de la pila: " + stack.size()); stack.printStack(); System.out.println("Desapilando: " + stack.pop()); System.out.println("Desapilando: " + stack.pop()); System.out.println("Tamaño de la pila después de desapilar dos elementos: " + stack.size()); stack.printStack(); } }