Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

مكدس عام

جزء من قسم البرمجة كائنية التوجه في رحلة Rust على Coddy. الدرس 59 من 61.

challenge icon

التحدي

سهل

إن 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) للتعامل مع حالة المكدس الفارغ
}

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Rust عبر الإنترنت