Pilha Genérica
Parte da seção Programação Orientada a Objetos do Journey de Rust da Coddy. Lição 59 de 61.
Desafio
FácilUma 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 criar uma estrutura de dados genérica Stack que pode armazenar qualquer tipo de elemento! Uma stack segue o princípio "Last In, First Out", como uma pilha de livros na qual você só pode adicionar ou remover itens do topo.
Você organizará seu código em dois arquivos:
stack.rs: defina sua struct genéricaStack<T>, que usa internamente umVec<T>para armazenar elementos. Implemente três métodos:newpara criar uma stack vazia,pushpara adicionar um elemento ao topo epoppara remover e retornar o elemento do topo (retornandoOption<T>, pois a stack pode estar vazia).main.rs: inclua seu módulo de stack e demonstre o funcionamento da sua Stack com inteiros. Crie uma stack, use push para adicionar os números fornecidos a ela e, em seguida, use pop para remover os elementos e imprimir cada um. Useunwrap_orpara lidar com oOptionretornado por pop; se a stack estiver vazia, use-1como valor padrão.
Uma stack precisa de duas operações essenciais:
- push: adiciona um elemento ao topo da stack
- pop: remove e retorna o elemento do topo
O método pop deve retornar um Option<T>, pois a stack pode estar vazia. O tipo Vec já possui um método pop que retorna Option<T>, e você pode aproveitá-lo na sua implementação.
Sua stack deve funcionar assim: quando você usa push nos valores 10, 20 e 30 (nessa ordem), usar pop três vezes deve fornecer 30, 20 e 10 (na ordem inversa). Um quarto pop em uma stack vazia deve retornar o valor padrão.
Imprima cada valor removido 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 adicionar à stack (converta cada um para i32). Depois de adicionar os três, use pop quatro vezes para demonstrar tanto as remoções bem-sucedidas quanto o caso de stack vazia.
Experimente você mesmo
mod stack;
use stack::Stack;
fn main() {
// Leia três 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: Crie uma nova Stack
// TODO: Empilhe os três números na stack (num1, num2, num3 nessa ordem)
// TODO: Desempilhe quatro vezes e imprima cada resultado
// Use unwrap_or(-1) para lidar com o caso de stack vazia
}
Todas as lições de Programação Orientada a Objetos
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 PlayerPratique por conta própria: Compilador de Rust online