Menu
Coddy logo textTech

Pila genérica

Parte de la sección Object Oriented Programming del Journey de Rust de Coddy — lección 59 de 61.

challenge icon

Desafío

Fácil

Una pila (stack) es una estructura de datos fundamental que sigue el principio "Last In, First Out" (LIFO): el último elemento añadido es el primero en ser eliminado. Piensa en una pila de platos: añades platos a la parte superior y los retiras de la parte superior.

¡Vamos a construir una estructura de datos Stack genérica que pueda contener cualquier tipo de elemento! Una pila sigue el principio "Last In, First Out", como una pila de libros donde solo puedes añadir o quitar desde la parte superior.

Organizarás tu código en dos archivos:

  • stack.rs: Define tu estructura genérica Stack<T> que utiliza un Vec<T> internamente para almacenar elementos. Implementa tres métodos: new para crear una pila vacía, push para añadir un elemento a la parte superior, y pop para eliminar y devolver el elemento superior (devolviendo Option<T> ya que la pila podría estar vacía).
  • main.rs: Importa tu módulo stack y demuestra el funcionamiento de tu Stack con enteros. Crea una pila, añade los números proporcionados en ella, luego extrae los elementos y muestra cada uno. Utiliza unwrap_or para manejar el Option devuelto por pop; si la pila está vacía, utiliza -1 como valor predeterminado.

Una pila necesita dos operaciones esenciales:

  • push — añade un elemento a la parte superior de la pila
  • pop — elimina y devuelve el elemento superior

El método pop debe devolver un Option<T> ya que la pila podría estar vacía. El tipo Vec ya tiene un método pop que devuelve Option<T>, el cual puedes aprovechar en tu implementación.

Tu pila debería funcionar así: cuando haces push de los valores 10, 20 y 30 (en ese orden), al hacer pop tres veces deberías obtener 30, 20 y 10 (orden inverso). Un cuarto pop en una pila vacía debería devolver el valor predeterminado.

Imprime cada valor extraído en su propia línea:

30
20
10
-1

Por ejemplo, con las entradas 5, 15 y 25:

25
15
5
-1

Recibirás tres entradas: tres enteros para añadir a la pila (analiza cada uno como i32). Después de añadir los tres, realiza pop cuatro veces para demostrar tanto las extracciones exitosas como el caso de la pila vacía.

Pruébalo tú mismo

mod stack;

use stack::Stack;

fn main() {
    // Lee tres enteros de la entrada
    let mut input1 = String::new();
    std::io::stdin().read_line(&mut input1).expect("Failed to read line");
    let num1: i32 = input1.trim().parse().expect("Invalid number");

    let mut input2 = String::new();
    std::io::stdin().read_line(&mut input2).expect("Failed to read line");
    let num2: i32 = input2.trim().parse().expect("Invalid number");

    let mut input3 = String::new();
    std::io::stdin().read_line(&mut input3).expect("Failed to read line");
    let num3: i32 = input3.trim().parse().expect("Invalid number");

    // TODO: Crea una nueva Stack

    // TODO: Haz push de los tres números en la pila (num1, num2, num3 en ese orden)

    // TODO: Haz pop cuatro veces e imprime cada resultado
    // Usa unwrap_or(-1) para manejar el caso de la pila vacía
}

Todas las lecciones de Object Oriented Programming