Pila genérica
Parte de la sección Object Oriented Programming del Journey de Rust de Coddy — lección 59 de 61.
Desafío
FácilUna 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éricaStack<T>que utiliza unVec<T>internamente para almacenar elementos. Implementa tres métodos:newpara crear una pila vacía,pushpara añadir un elemento a la parte superior, ypoppara eliminar y devolver el elemento superior (devolviendoOption<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. Utilizaunwrap_orpara manejar elOptiondevuelto por pop; si la pila está vacía, utiliza-1como 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
-1Por ejemplo, con las entradas 5, 15 y 25:
25
15
5
-1Recibirá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
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 multimedia