class Node { long data; // El dato que se almacenará en el nodo Node next; // Referencia al siguiente nodo en la lista public Node(long data) { this.data = data; this.next = null; } } public class Stack { private Node top; // Referencia al nodo superior (cima) del stack // Constructor para inicializar un stack vacío public Stack() { top = null; } // Método para añadir un elemento al stack public void push(long j) { Node newNode = new Node(j); if (top == null) { top = newNode; // Si el stack está vacío, el nuevo nodo será la cima } else { newNode.next = top; // El siguiente del nuevo nodo apunta al actual nodo superior top = newNode; // El nuevo nodo se convierte en la nueva cima } } // Método para eliminar un elemento del stack public long pop() { if (top == null) { System.out.println("El stack está vacío."); return -1; // Valor especial para indicar error (stack vacío) } else { long temp = top.data; // Guarda el dato de la cima en una variable temporal top = top.next; // Mueve la cima al siguiente nodo return temp; // Devuelve el dato eliminado } } // Método para verificar si el stack está vacío public boolean isEmpty() { return (top == null); } // Método para obtener el elemento en la cima del stack sin eliminarlo public long peek() { if (top == null) { System.out.println("El stack está vacío."); return -1; // Valor especial para indicar error (stack vacío) } else { return top.data; } } public static void main(String[] args) { Stack stack = new Stack(); // Crear un stack vacío stack.push(10); stack.push(20); stack.push(30); stack.push(40); stack.push(50); while (!stack.isEmpty()) { System.out.print(stack.pop() + " "); // Debería imprimir 50 40 30 20 10 } } }