Pilha Genérica
Parte da seção Object Oriented Programming do Journey de Rust da Coddy — lição 59 de 61.
Desafio
FácilUma pilha (stack) é uma estrutura de dados fundamental que segue o princípio "Last In, First Out" (LIFO) — o último item adicionado é o primeiro a ser removido. Pense em uma pilha de pratos: você adiciona pratos no topo e os remove do topo.
Vamos construir uma estrutura de dados Stack genérica que pode conter qualquer tipo de elemento! Uma pilha segue o princípio "Last In, First Out" — como uma pilha de livros onde você só pode adicionar ou remover do topo.
Você organizará seu código em dois arquivos:
stack.rs: Defina sua structStack<T>genérica que usa umVec<T>internamente para armazenar elementos. Implemente três métodos:newpara criar uma pilha vazia,pushpara adicionar um elemento ao topo epoppara remover e retornar o elemento do topo (retornandoOption<T>, já que a pilha pode estar vazia).main.rs: Importe seu módulo stack e demonstre sua Stack funcionando com inteiros. Crie uma pilha, faça o push dos números fornecidos nela, depois faça o pop dos elementos e imprima cada um. Useunwrap_orpara lidar com oOptionretornado pelo pop — se a pilha estiver vazia, use-1como o valor padrão.
Uma pilha precisa de duas operações essenciais:
- push — adiciona um elemento ao topo da pilha
- pop — remove e retorna o elemento do topo
O método pop deve retornar um Option<T>, pois a pilha pode estar vazia. O tipo Vec já possui um método pop que retorna Option<T>, o qual você pode aproveitar em sua implementação.
Sua pilha deve funcionar assim: quando você faz o push dos valores 10, 20 e 30 (nessa ordem), fazer o pop três vezes deve resultar em 30, 20 e 10 (ordem inversa). Um quarto pop em uma pilha vazia deve retornar o valor padrão.
Imprima cada valor retornado pelo pop em sua própria linha:
30
20
10
-1Por exemplo, com as entradas 5, 15 e 25:
25
15
5
-1Você receberá três entradas: três inteiros para fazer o push na pilha (analise cada um como i32). Após fazer o push dos três, faça o pop quatro vezes para demonstrar tanto os pops bem-sucedidos quanto o caso da pilha vazia.
Experimente você mesmo
mod stack;
use stack::Stack;
fn main() {
// Lê três números inteiros da 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: Criar uma nova Stack
// TODO: Fazer o push dos três números na pilha (num1, num2, num3 nessa ordem)
// TODO: Fazer o pop quatro vezes e imprimir cada resultado
// Use unwrap_or(-1) para lidar com o caso de pilha vazia
}
Todas as lições de Object Oriented Programming
1Métodos e Comportamento
Introdução a Blocos de ImplementaçãoO Parâmetro SelfMétodos MutáveisFunções AssociadasMúltiplos Blocos de ImplementaçãoEncadeamento de MétodosRecapitulação - Ações de Retângulo4Projeto: Pet Virtual
Definindo o PetAlimentando o Pet7Traits Padrão
A Trait DebugA Trait DisplayClone e CopyTraits de IgualdadeRecapitulação - Ponto Imprimível10Projeto: Sistema de Documentos
A Trait DrawComponente de Texto2Encapsulamento e Módulos
Fundamentos de MódulosA Palavra-chave PublicCampos PrivadosGettersSettersRecapitulação - Cofre Seguro5Genéricos
Structs GenéricasMétodos GenéricosMúltiplos Tipos GenéricosFunções GenéricasRecapitulação - Ponto de Coordenada8Traits como Restrições
Sintaxe de Restrições de TraitRestrições MúltiplasA Cláusula WhereRetornando Tipos com TraitsRecapitulação - Impressora Genérica11Padrões de Projeto em Rust
Padrão NewtypeComposiçãoA Trait DropFrom e IntoRecapitulação - Mock de Smart Pointer3Enums Avançados
Enums com DadosMétodos em EnumsCorrespondência de Variantes de DadosO Enum Option RevisitadoRecapitulação - Enum Shape6Definição de Traits
O que é uma Trait?Implementando TraitsImplementações PadrãoSobrescrevendo PadrõesTraits com ParâmetrosRecapitulação - Media Player