🔥 أحدث الأخبار

موقع يهتم بكل ماهو جديد في عالم التكنولوجيا والرياضة

كورس C++ المتوسط – الحلقة العاشرة: Queue و Priority Queue

 

كورس C++ المتوسط – الحلقة العاشرة: Queue و Priority Queue

#برمجة

مقدمة

مرحباً بك في الحلقة العاشرة من المستوى المتوسط في C++.

في الحلقة السابقة تعلمنا:

  • Doubly Linked List
  • Stack
  • push
  • pop
  • top
  • تطبيقات Undo / Redo

واليوم سنتعلم هيكلين مهمين جداً من هياكل البيانات:

Queue

و

Priority Queue

وهما مستخدمان في:

  • أنظمة المستشفيات
  • أنظمة الحجز
  • إدارة الطابور
  • أنظمة التشغيل
  • الألعاب
  • الشبكات

ما هي Queue؟

Queue تعني:

الطابور

وتعمل بمبدأ:

First In First Out

اختصاراً:

FIFO

مثال من الحياة

طابور في البنك:

Ahmed
Ali
Khaled

أول شخص دخل هو أول شخص يخرج.


الفرق بين Queue و Stack

Stack

آخر داخل = أول خارج

LIFO


Queue

أول داخل = أول خارج

FIFO


إضافة مكتبة Queue

#include <queue>

إنشاء Queue

queue<int> numbers;

إضافة عناصر

numbers.push(10);
numbers.push(20);
numbers.push(30);

الشكل

10 20 30

أول عنصر

cout << numbers.front();

الناتج

10

آخر عنصر

cout << numbers.back();

الناتج

30

حذف أول عنصر

numbers.pop();

يصبح

20 30

مثال كامل

#include <iostream>
#include <queue>
using namespace std;

int main()
{
    queue<int> numbers;

    numbers.push(10);
    numbers.push(20);
    numbers.push(30);

    cout << "Front: "
         << numbers.front()
         << endl;

    numbers.pop();

    cout << "New Front: "
         << numbers.front();

    return 0;
}

معرفة عدد العناصر

cout << numbers.size();

التحقق إذا كان فارغاً

if(numbers.empty())
{
    cout << "Empty";
}

المرور على Queue

لا يمكن الوصول للعناصر مباشرة مثل Vector.

نستخدم نسخة مؤقتة:

queue<int> temp = numbers;

مثال

while(!temp.empty())
{
    cout << temp.front() << endl;

    temp.pop();
}

مشروع عملي: نظام انتظار العملاء

#include <iostream>
#include <queue>
using namespace std;

int main()
{
    queue<string> customers;

    customers.push("Ahmed");
    customers.push("Ali");
    customers.push("Khaled");

    while(!customers.empty())
    {
        cout << "Serving: "
             << customers.front()
             << endl;

        customers.pop();
    }

    return 0;
}

الناتج

Serving: Ahmed
Serving: Ali
Serving: Khaled

ما هي Priority Queue؟

في بعض الأنظمة لا نريد:

أول داخل = أول خارج

بل نريد:

الأهم أولاً

مثال

في المستشفى:

مريض عادي
مريض طارئ

المريض الطارئ يجب أن يدخل أولاً.


إنشاء Priority Queue

priority_queue<int> pq;

إضافة عناصر

pq.push(10);
pq.push(50);
pq.push(20);
pq.push(100);

أعلى أولوية

cout << pq.top();

الناتج

100

لماذا؟

لأن Priority Queue ترتب العناصر تلقائياً.


مثال كامل

#include <iostream>
#include <queue>
using namespace std;

int main()
{
    priority_queue<int> pq;

    pq.push(10);
    pq.push(50);
    pq.push(20);
    pq.push(100);

    while(!pq.empty())
    {
        cout << pq.top() << endl;

        pq.pop();
    }

    return 0;
}

الناتج

100
50
20
10

Priority Queue تصاعدية

افتراضياً:

الأكبر أولاً

يمكن جعلها:

الأصغر أولاً

الكود

priority_queue<
int,
vector<int>,
greater<int>
> pq;

مثال

#include <iostream>
#include <queue>
#include <vector>
using namespace std;

int main()
{
    priority_queue<
    int,
    vector<int>,
    greater<int>
    > pq;

    pq.push(10);
    pq.push(50);
    pq.push(5);

    while(!pq.empty())
    {
        cout << pq.top() << endl;

        pq.pop();
    }

    return 0;
}

الناتج

5
10
50

تطبيق عملي: نظام مهام

#include <iostream>
#include <queue>
using namespace std;

int main()
{
    priority_queue<int> tasks;

    tasks.push(1);
    tasks.push(5);
    tasks.push(10);

    cout << "Next Task Priority: "
         << tasks.top();

    return 0;
}

أين تستخدم Queue؟

✔ أنظمة الحجز

✔ مراكز الاتصال

✔ الطابعات

✔ تحميل الملفات

✔ أنظمة الرسائل


أين تستخدم Priority Queue؟

✔ المستشفيات

✔ أنظمة التشغيل

✔ الذكاء الاصطناعي

✔ الألعاب

✔ جدولة المهام


مقارنة Queue و Priority Queue

Queue Priority Queue
FIFO حسب الأولوية
بسيط أكثر ذكاءً
أول داخل أول خارج الأعلى أولوية أولاً
أسرع قليلاً أكثر مرونة

أخطاء شائعة

❌ استخدام:

front()

على Queue فارغة.


❌ استخدام:

top()

على Priority Queue فارغة.


❌ نسيان:

empty()

قبل الوصول للعناصر.


تمارين

التمرين 1

أنشئ Queue تحتوي:

10
20
30

واطبع أول عنصر.


التمرين 2

احذف عنصرين باستخدام pop.


التمرين 3

اعرض جميع عناصر Queue.


التمرين 4

أنشئ Priority Queue تحتوي:

15
50
5
90

واطبع العناصر بالترتيب.


التمرين 5

اصنع نظام انتظار مرضى مع أولوية للحالات الطارئة.


ملخص الحلقة العاشرة

في هذه الحلقة تعلمنا:

  • Queue
  • FIFO
  • push
  • pop
  • front
  • back
  • Priority Queue
  • top
  • الأولويات
  • تطبيقات عملية

انتهى المستوى المتوسط الأساسي 🎉

المستوى القادم: C++ المتقدم (Advanced C++)

سنبدأ بـ:

🔥 Templates
🔥 Exception Handling
🔥 Smart Pointers
🔥 Lambda Functions
🔥 Multithreading
🔥 STL Advanced
🔥 مشاريع احترافية كبيرة

وهنا تبدأ مرحلة الاحتراف الحقيقية في لغة C++. 🚀

تعليقات

💬 🙋🏻‍♂️