제네릭 스택
Coddy Rust 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 61개 중 59번째.
챌린지
쉬움스택(stack)은 "후입선출"(Last In, First Out, LIFO) 원칙을 따르는 기본적인 데이터 구조입니다. 즉, 마지막에 추가된 항목이 가장 먼저 제거됩니다. 접시 더미를 생각해보세요. 접시를 맨 위에 쌓고 맨 위에서부터 꺼냅니다.
어떤 타입의 요소든 담을 수 있는 제네릭 Stack 데이터 구조를 만들어 봅시다! 스택은 책 더미처럼 맨 위에서만 추가하거나 제거할 수 있는 "후입선출" 원칙을 따릅니다.
코드는 두 개의 파일로 구성됩니다:
stack.rs: 내부적으로 요소를 저장하기 위해Vec<T>를 사용하는 제네릭Stack<T>구조체를 정의합니다. 세 가지 메서드를 구현하세요: 빈 스택을 생성하는new, 맨 위에 요소를 추가하는push, 그리고 맨 위의 요소를 제거하고 반환하는pop(스택이 비어있을 수 있으므로Option<T>를 반환합니다).main.rs: 스택 모듈을 가져와서 정수를 사용하는 Stack의 동작을 보여줍니다. 스택을 생성하고, 제공된 숫자들을 푸시한 다음, 요소들을 팝하여 각각 출력합니다. pop에 의해 반환된Option을 처리하기 위해unwrap_or를 사용하세요. 스택이 비어있다면 기본값으로-1을 사용합니다.
스택에는 두 가지 필수 연산이 필요합니다:
- push — 스택의 맨 위에 요소를 추가합니다.
- pop — 맨 위의 요소를 제거하고 반환합니다.
스택이 비어있을 수 있으므로 pop 메서드는 Option<T>를 반환해야 합니다. Vec 타입에는 이미 Option<T>를 반환하는 pop 메서드가 있으며, 이를 구현에 활용할 수 있습니다.
스택은 다음과 같이 동작해야 합니다: 10, 20, 30 순서대로 값을 푸시하면, 세 번 팝했을 때 30, 20, 10 순서(역순)로 나와야 합니다. 비어있는 스택에서 네 번째 팝을 하면 기본값을 반환해야 합니다.
팝된 각 값을 개별 줄에 출력하세요:
30
20
10
-1예를 들어, 입력값이 5, 15, 25인 경우:
25
15
5
-1세 개의 입력을 받게 됩니다: 스택에 푸시할 세 개의 정수(각각 i32로 파싱). 세 개를 모두 푸시한 후, 네 번 팝하여 성공적인 팝과 스택이 비어있는 경우를 모두 보여주세요.
직접 해보기
mod stack;
use stack::Stack;
fn main() {
// 입력에서 세 개의 정수를 읽어옵니다
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: 새로운 Stack을 생성합니다
// TODO: 세 개의 숫자를 스택에 푸시합니다 (num1, num2, num3 순서대로)
// TODO: 네 번 팝(pop)하고 각 결과를 출력합니다
// 스택이 비어 있는 경우를 처리하기 위해 unwrap_or(-1)을 사용하세요
}