מחסנית גנרית
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Rust של Coddy. שיעור 59 מתוך 61.
אתגר
קלמחסנית היא מבנה נתונים בסיסי שפועל לפי העיקרון "אחרון נכנס, ראשון יוצא" (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) כדי לטפל במקרה שבו המחסנית ריקה
}
כל השיעורים ביחידה תכנות מונחה עצמים
1מתודות והתנהגות
מבוא לבלוקי מימושהפרמטר selfמתודות ניתנות לשינויפונקציות משויכותבלוקי מימוש מרוביםשרשור מתודותסיכום – פעולות מלבן4פרויקט: חיית מחמד וירטואלית
הגדרת חיית המחמדהאכלת חיית המחמדתרגלו בעצמכם: קומפיילר Rust אונליין