مكدس عام
جزء من قسم البرمجة كائنية التوجه في رحلة Rust على Coddy. الدرس 59 من 61.
التحدي
سهلإن stack هي بنية بيانات أساسية تتبع مبدأ "Last In, First Out" (LIFO): إذ إن العنصر الأخير المضاف هو أول عنصر تتم إزالته. تخيّل كومة من الأطباق: تضيف الأطباق إلى الأعلى وتزيلها من الأعلى.
لنبنِ بنية بيانات Stack عامة يمكنها الاحتفاظ بأي نوع من العناصر! تتبع stack مبدأ "Last In, First Out"، مثل كومة من الكتب حيث لا يمكنك الإضافة أو الإزالة إلا من الأعلى.
ستنظّم شيفرتك عبر ملفين:
stack.rs: عرّف بنيةStack<T>العامة التي تستخدمVec<T>داخليًا لتخزين العناصر. Implement ثلاثة methods:newلإنشاء stack فارغة، وpushلإضافة عنصر إلى الأعلى، وpopلإزالة العنصر العلوي وإرجاعه (مع إرجاعOption<T>لأن stack قد تكون فارغة).main.rs: استورد وحدة stack واعرض عمل Stack باستخدام الأعداد الصحيحة. Create stack، ثم ادفع الأعداد المقدَّمة onto it، وبعد ذلك أزل العناصر واحدًا تلو الآخر واطبع كل عنصر. استخدمunwrap_orللتعامل معOptionالمُرجعة بواسطة pop؛ إذا كانت stack فارغة، فاستخدم-1كقيمة افتراضية.
تحتاج stack إلى عمليتين أساسيتين:
- push: يضيف عنصرًا إلى أعلى stack
- pop: يزيل العنصر العلوي ويُرجعه
ينبغي أن تُرجع method pop قيمة Option<T> لأن stack قد تكون فارغة. يحتوي النوع Vec بالفعل على method باسم pop تُرجع Option<T>، ويمكنك الاستفادة منها في Implement الخاص بك.
ينبغي أن تعمل stack لديك كما يلي: عندما تدفع القيم 10 و20 و30 (بهذا order)، فإن تنفيذ pop ثلاث مرات ينبغي أن يعطيك 30 و20 و10 (بترتيب عكسي). وينبغي أن يُرجع تنفيذ pop رابع على stack فارغة القيمة الافتراضية.
اطبع كل قيمة تتم إزالتها في سطر مستقل:
30
20
10
-1على سبيل المثال، مع المدخلات 5 و15 و25:
25
15
5
-1ستتلقى ثلاث مدخلات: ثلاثة أعداد صحيحة لدفعها إلى stack (parse كل عدد باعتباره i32). بعد دفع الأعداد الثلاثة، نفّذ pop أربع مرات لإظهار كلٍّ من عمليات pop الناجحة وحالة stack الفارغة.
جرّب بنفسك
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مشروع: حيوان أليف افتراضي
تعريف الحيوان الأليفإطعام الحيوان الأليف2التغليف والوحدات البرمجية
أساسيات الوحدات البرمجيةالكلمة المفتاحية Publicالحقول الخاصةدوال Gettersدوال Settersمراجعة - الخزانة الآمنة5الأنواع العامة (Generics)
الـ Structs العامةالـ Methods العامةأنواع عامة متعددةالـ Functions العامةمراجعة - Coordinate Point3التعدادات المتقدمة (Advanced Enums)
التعدادات مع البياناتالأساليب (Methods) في التعداداتمطابقة حالات البياناتمراجعة التعداد Optionملخص - التعداد Shape6تعريف الـ Traits
ما هي الـ Trait؟تنفيذ الـ Traitsالتنفيذات الافتراضيةتجاوز التنفيذات الافتراضيةالـ Traits مع المعاملاتملخص - مشغل الوسائطتدرّب بنفسك: مترجم Rust عبر الإنترنت