Pila genérica
Parte de la sección Programación Orientada a Objetos del Journey de Rust de Coddy. Lección 59 de 61.
Desafío
FácilUna pila es una estructura de datos fundamental que sigue el principio «Last In, First Out» (LIFO): el último elemento añadido es el primero que se elimina. Piensa en una pila de platos: añades platos por arriba y los retiras por arriba.
¡Construyamos una estructura de datos genérica Stack que pueda contener cualquier tipo de elemento! Una pila sigue el principio «Last In, First Out», como una pila de libros en la que solo puedes añadir o retirar elementos por arriba.
Organizarás tu código en dos archivos:
stack.rs: Define tu estructura genéricaStack<T>, que utiliza internamente unVec<T>para almacenar elementos. Implementa tres métodos:newpara crear una pila vacía,pushpara añadir un elemento arriba ypoppara eliminar y devolver el elemento superior (devolviendoOption<T>, ya que la pila podría estar vacía).main.rs: Incluye tu módulo de pila y demuestra el funcionamiento de tu Stack con enteros. Crea una pila, añade los números proporcionados y después extrae los elementos e imprime cada uno. Usaunwrap_orpara gestionar elOptiondevuelto por pop; si la pila está vacía, usa-1como valor predeterminado.
Una pila necesita dos operaciones esenciales:
- push: añade un elemento arriba 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>, y puedes aprovecharlo en tu implementación.
Tu pila debería funcionar así: cuando añades los valores 10, 20 y 30 (en ese orden), extraer elementos tres veces debería darte 30, 20 y 10 (en orden inverso). Una cuarta extracción en una pila vacía debería devolver el valor predeterminado.
Imprime cada valor extraído en su propia línea:
30
20
10
-1Por ejemplo, con las entradas 5, 15 y 25:
25
15
5
-1Recibirás tres entradas: tres enteros que debes añadir a la pila (convierte cada uno a i32). Después de añadir los tres, extrae elementos cuatro veces para demostrar tanto las extracciones exitosas como el caso de una 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 un nuevo Stack
// TODO: Empuja 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 Programación Orientada a Objetos
1Métodos y Comportamiento
Intro a Bloques de ImplementaciónEl Parámetro SelfMétodos MutablesFunciones AsociadasMúltiples Bloques de ImplementaciónEncadenamiento de MétodosResumen - Acciones de Rectángulo4Proyecto: Mascota virtual
Definir la mascotaAlimentar a la mascota7Traits estándar
El trait DebugEl trait DisplayClone y CopyTraits de igualdadResumen - Punto imprimible10Proyecto: Sistema de documentos
El Trait DrawComponente de texto2Encapsulamiento y módulos
Conceptos básicos de módulosLa palabra clave PublicCampos privadosGettersSettersRepaso - Casillero seguro5Genéricos
Estructuras genéricasMétodos genéricosMúltiples tipos genéricosFunciones genéricasResumen - Punto de coordenadas8Traits como límites
Sintaxis de límites de traitsLímites múltiplesLa cláusula whereRetornar tipos con traitsResumen: Impresora genérica11Patrones de diseño en Rust
Patrón NewtypeComposiciónEl Trait DropFrom e IntoResumen - Mock de Smart Pointer3Enums avanzados
Enums con datosMétodos en EnumsCoincidencia de variantes de datosEl Enum Option revisitadoResumen - Enum Shape6Definición de Traits
¿Qué es un Trait?Implementación de TraitsImplementaciones por defectoSobrescribir valores por defectoTraits con parámetrosResumen - Reproductor multimediaPractica por tu cuenta: Compilador de Rust online