Menu
Coddy logo textTech

מחסנית גנרית

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Rust של Coddy. שיעור 59 מתוך 61.

challenge icon

אתגר

קל

מחסנית היא מבנה נתונים בסיסי שפועל לפי העיקרון "אחרון נכנס, ראשון יוצא" (LIFO): הפריט האחרון שנוסף הוא הראשון שמוסר. חשבו על ערמת צלחות: מוסיפים צלחות לחלק העליון ומסירים אותן מלמעלה.

בואו נבנה מבנה נתונים גנרי מסוג Stack שיכול להכיל כל סוג של איבר! מחסנית פועלת לפי העיקרון "אחרון נכנס, ראשון יוצא", כמו ערמת ספרים שאפשר להוסיף אליה או להסיר ממנה רק מלמעלה.

תארגנו את הקוד שלכם בשני קבצים:

  • stack.rs: הגדירו את המבנה הגנרי Stack<T>, שמשתמש באופן פנימי ב-Vec<T> לאחסון איברים. מימשו שלוש מתודות: new ליצירת מחסנית ריקה, push להוספת איבר לראש המחסנית, ו-pop להסרה ולהחזרה של האיבר שבראש המחסנית (המתודה מחזירה Option<T> מכיוון שהמחסנית עשויה להיות ריקה).
  • main.rs: ייבאו את מודול המחסנית שלכם והדגימו כיצד המחסנית פועלת עם מספרים שלמים. צרו מחסנית, דחפו לתוכה את המספרים שסופקו, ואז הסירו ממנה איברים והדפיסו כל אחד מהם. השתמשו ב-unwrap_or כדי לטפל בערך Option שמוחזר על ידי pop; אם המחסנית ריקה, השתמשו ב--1 כערך ברירת המחדל.

מחסנית זקוקה לשתי פעולות חיוניות:

  • push: מוסיפה איבר לראש המחסנית
  • pop: מסירה ומחזירה את האיבר שבראש המחסנית

המתודה pop צריכה להחזיר Option<T> מכיוון שהמחסנית עשויה להיות ריקה. לסוג Vec כבר יש מתודת pop שמחזירה Option<T>, ותוכלו להשתמש בה במימוש שלכם.

המחסנית שלכם צריכה לפעול כך: כאשר דוחפים לתוכה את הערכים 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: הוציאו מהמחסנית ארבע פעמים והדפיסו כל תוצאה
    // השתמשו ב-unwrap_or(-1) כדי לטפל במקרה שבו המחסנית ריקה
}

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Rust אונליין