إعلان
دورة تطوير التطبيقات باستخدام لغة JavaScript في هذه الدورة ستتعلم لغة جافا سكريبت, استخدام مكتبة React.js, بناء API الموقع بواسطة Node.js, تطوير تطبيق جوال باستخدام React Native, و في نهاية الدورة ستتعلم تطوير تطبيق محادثة شبيه بتطبيق WhatsApp. تعلم الآن
دورة تطوير واجهات المستخدم في هذه الدورة ستتعلم لغة HTML و لغة CSS و لغة JavaScript. من ناحية التطبيق العملي ستتعلم طريقة بناء واجهة متجر إلكتروني مكون من ست صفحات, تحويل خمسة تصاميم PSD إلى صفحات ويب, بناء واجهة مستخدم تشبه موقع يوتيوب, بناء لوحة تحكم إحترافية. تعلم الآن
تطوير تطبيقات باستخدام لغة بايثون في هذه الدورة ستتعلم أساسيات البرمجة بلغة بايثون وصولاً إلى التعامل مع أشهر أطر العمل (Flask و Django) و ستتعلم كيف تبني متجر إلكتروني يمكن للمستخدمين البيع و الشراء من خلاله. تعلم الآن
دورة تطوير تطبيقات الويب باستخدام لغة PHP في هذه الدورة ستتعلم لغة PHP من الصفر, استخدام إطار العمل Laravel بشرح مفصّل و عملي, كيفية تطوير شبكة اجتماعية تشبه Instagram, بناء API لتطبيق جوال وفق أسلوب RESTful, تطوير موقع إعلانات مبوبة, تطوير نظام إدارة محتوى CMS كامل. تعلم الآن
دورة تطوير تطبيقات الويب باستخدام لغة Ruby في هذه الدورة ستتعلم البرمجة بلغة Ruby إنطلاقاً من أبسط المفاهيم وحتى بناء تطبيق حقيقي, إستخدام إطار العمل Ruby on Rails بشرح مفصّل و عملي, بناء تطبيق حقيقي عبارة عن شبكة اجتماعية تشبه تويتر, تطوير مجتمع الكتروني يشبه حسوب I/O. تعلم الآن
دورة علوم الحاسوب هذه الدورة معدة لتكون مدخل لعلوم الحاسوب و لغات البرمجة حيث ستتعرف فيها على أنظمة التشغيل و ستتعمق في نظام لينكس و في كيفية التعامل معه من خلال موجه الأوامر, بالإضافة إلى قواعد البيانات و أساسيات الشبكات و الخوادم و مبادئ الحماية والأمان في الويب. تعلم الآن

    C++ الكلاس queue

    تعريف الكلاس queue

    يستخدم لإنشاء كائن يمثل حاوية تخزن العناصر التي نضيفها فيها بشكل متسلسل وراء بعضها البعض و كأنها موضوعة في نفق يمكن السير فيه باتجاه واحد, حيث أن العنصر يضاف فيها من جهة يمكن و من ثم يمكن إخراجه منها من الجهة المقابلة.

    طريقة تخزين العناصر في هذه الحاوية تعتمد أسلوب FIFO الذي هو اختصار لجملة First In First out و التي تعني أن أول عنصر يتم إضافته في الحاوية هو أول عنصر يمكن إخراجه منها و كأنه يوجد جهة يتم منها إضافة العناصر و جهة يمكن إسترجاعها منها كالتالي.



    لاستخدام الكلاس queue - أي حتى تتمكن من إنشاء كائنات منه - يجب تضمين الملف #include<queue> لأنه موجود فيه.


    بناء الكلاس

    template < class T, class Alloc = allocator<T> >
    class queue;
    	

    إذاً عند إنشاء كائن من الكلاس queue يجب أن نمرر له نوع البيانات الذي نريد تخزينه فيه مكان الباراميتر T.

    دوال الكلاس queue

    الجدول التالي يحتوي على جميع دوال الكلاس queue.

    الدالة مع تعريفها
    bool empty() تستخدم لمعرفة ما إن كان الكائن الذي قام باستدعائها فارغاً أم لا.
    ترجع false في حال كان يوجد فيه عنصر أو أكثر, و ترجع true إن لم يكن كذلك.
    size_t size() تستخدم للحصول على عدد العناصر الموجودة في الكائن الذي قام باستدعائها.
    reference& front() تستخدم لتغيير قيمة العنصر الأقدم في الكائن الذي قام باستدعائها أو للحصول على قيمته.
    reference& back() تستخدم لتغيير قيمة العنصر الأحدث في الكائن الذي قام باستدعائها أو للحصول على قيمته.
    void push(T& val) تستخدم لإضافة عنصر جديد في الكائن الذي قام باستدعائها.
    مكان الباراميتر val نمرر العنصر الذي نريد إضافته.
    void emplace(T& val) تستخدم لإضافة عنصر جديد في الكائن الذي قام باستدعائها تماماً كالدالة push().
    مكان الباراميتر val نمرر العنصر الذي نريد إضافته.
    void pop() تستخدم لحذف العنصر الأقدم من الكائن الذي قام باستدعائها.
    void swap(queue& anotherQueue) تستخدم لتبديل قيم عناصر الكائن الذي قام باستدعائها بقيم عناصر الكائن الذي نمرره لها.
    مكان الباراميتر anotherQueue نمرر لها كائن من الكلاس queue يملك نفس نوع عناصر الكائن الذي قام باستدعائها.

    أمثلة شاملة حول التعامل مع الكلاس queue

    في كل مثال موضوع قمنا باستخدام دوال جديدة حتى تعرف كيف تستخدم جميع الدوال التي ذكرناها في الجدول.


    في المثال التالي قمنا بتعريف كائن من queue مع تحديد أنه يمكن أن يحتوي على عناصر نوعها int.
    بعدها قمنا بإضافة بعض العناصر فيه و من ثم طباعة عدد العناصر التي قمنا بإضافتها, قيمة أقدم عنصر و قيمة أحدث عنصر.

    ملاحظة: قمنا باستخدام الدالة push() لإضافة العناصر, الدالة size() لمعرفة عدد العناصر التي تم إضافتها, الدالة front() للحصول على قيمة العنصر الأقدم في الكائن و الدالة back() للحصول على قيمة العنصر الأحدث فيه.

    المثال الأول

    main.cpp
    #include <iostream>
    #include <queue>
    
    using namespace std;
    
    int main()
    {
    	// int يمكنه أن يحتوي على قيم نوعها queue هنا قمنا بتعريف كائن من الكلاس
        queue<int> myQueue;
    
    	// push() باستخدام الدالة myQueue هنا قمنا بإضافة 5 عناصر في الكائن
    	myQueue.push(1);
    	myQueue.push(2);
    	myQueue.push(3);
    	myQueue.push(4);
    	myQueue.push(5);
    	
    	// size() باستخدام الدالة myQueue هنا قمنا بطباعة عدد عناصر الكائن
        cout << "Stack size = " << myQueue.size() << endl;
    	
    	// هنا قمنا بطباعة القيمة العنصر الأقدم في الكائن, أي قيمة أول عنصر تم إضافته فيه
        cout << "Oldest value = " << myQueue.front() << endl;
    	
    	// هنا قمنا بطباعة القيمة العنسر الأحدث في الكائن, أي قيمة آخر عنصر تم إضافته فيه
        cout << "Newest value = " << myQueue.back();
    
        return 0;
    }
    		

    سنحصل على النتيجة التالية عند التشغيل.

    Stack size = 5
    Oldest value = 1
    Newest value = 5
    		


    في المثال التالي قمنا بتعريف كائن من queue مع تحديد أنه يمكن أن يحتوي على عناصر نوعها int.
    بعدها قمنا بإضافة بعض العناصر فيه و من ثم قمنا بعرض جميع القيم الموجودة فيه من خلال حلقة تستمر في التنفيذ طالما أن الكائن غير فارغ; في كل دورة في الحلقة كنا نقوم بعرض قيمة العنصر الأقدم فيه و من ثم نحذفه حتى نتمكن من الوصول للعنصر الموجود خلفه مباشرةً.

    ملاحظة: قمنا باستخدام الدالة push() لإضافة العناصر, الدالة front() للحصول على قيمة العنصر الأقدم في الكائن في كل مرة, الدالة pop() لحذف العنصر الأقدم في الكائن و الدالة empty() لمعرفة ما إن كان الكائن يحتوي على عناصر بعد أم لا.

    المثال الثاني

    main.cpp
    #include <iostream>
    #include <queue>
    
    using namespace std;
    
    int main()
    {
    	// int يمكنه أن يحتوي على قيم نوعها queue هنا قمنا بتعريف كائن من الكلاس
        queue<int> myQueue;
    
    	// push() باستخدام الدالة myQueue هنا قمنا بإضافة 5 عناصر في الكائن
    	myQueue.push(1);
    	myQueue.push(2);
    	myQueue.push(3);
    	myQueue.push(4);
    	myQueue.push(5);
    	
        cout << "Popping out queue elements:";
    
    	// لا يزال يحتوي على عناصر myQueue هنا قمنا بإنشاء حلقة تستمر في تنفيذ الأوامر الموجودة في فيها طالما أن الكائن
    	// بعدها سيتم حذفه مباشرةً ,myQueue في كل دورة من دورات الحلقة سيتم طباعة قيمة العنصر الموجود في أعلى الكائن
        while (!myQueue.empty())
        {
            cout << " " << myQueue.front();
    		myQueue.pop();
        }
    
        return 0;
    }
    		

    سنحصل على النتيجة التالية عند التشغيل.

    Popping out queue elements: 1 2 3 4 5
    		


    في المثال التالي قمنا بتعريف كائنين من queue مع تحديد أنه يمكن أن يحتويان على عناصر نوعها int.
    بعدها قمنا بتبديل عناصرهما و من ثم طباعة القيم التي أصبحت موجودة في كلٍّ منهما.

    ملاحظة: قمنا باستخدام الدالة swap() لتبديل قيمهما.

    المثال الثالث

    main.cpp
    #include <iostream>
    #include <queue>
    
    using namespace std;
    
    int main()
    {
    	// int يمكنهما أن يحتويان على قيم نوعها queue هنا قمنا بتعريف كائنين من الكلاس
        queue<int> queue1;
        queue<int> queue2;
    
    	// push() باستخدام الدالة queue1 هنا قمنا بإضافة 4 عناصر في الكائن
    	queue1.push(1);
    	queue1.push(2);
    	queue1.push(3);
    	queue1.push(4);
    	
    	// push() باستخدام الدالة queue2 هنا قمنا بإضافة 4 عناصر في الكائن
    	queue2.push(5);
    	queue2.push(6);
    	queue2.push(7);
    	queue2.push(8);
    	
    	// queue2 مع قيم الكائن queue1 هنا قمنا بتبديل قيم الكائن
    	queue1.swap(queue2);
    	
        cout << "Popping out queue1 elements:";
    
    	// لا يزال يحتوي على عناصر queue1 هنا قمنا بإنشاء حلقة تستمر في تنفيذ الأوامر الموجودة في فيها طالما أن الكائن
    	// بعدها سيتم حذفه مباشرةً ,queue1 في كل دورة من دورات الحلقة سيتم طباعة قيمة العنصر الموجود في أعلى الكائن
        while (!queue1.empty())
        {
            cout << " " << queue1.front();
    		queue1.pop();
        }
    	
        cout << "\nPopping out queue2 elements:";
    
    	// لا يزال يحتوي على عناصر queue2 هنا قمنا بإنشاء حلقة تستمر في تنفيذ الأوامر الموجودة في فيها طالما أن الكائن
    	// بعدها سيتم حذفه مباشرةً ,queue2 في كل دورة من دورات الحلقة سيتم طباعة قيمة العنصر الموجود في أعلى الكائن
        while (!queue2.empty())
        {
            cout << " " << queue2.front();
    		queue2.pop();
        }
    
        return 0;
    }
    		

    سنحصل على النتيجة التالية عند التشغيل.

    Popping out queue1 elements: 5 6 7 8
    Popping out queue2 elements: 1 2 3 4
    		

    الدورات

    أدوات مساعدة

    الأقسام

    دورات
    مقالات أسئلة مشاريع كتب