الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

[ تمت الإجابة ]الطابور - هياكل بيانات

بدأه الدنيا حلوة في 20 نوفمبر 2012 · 3 رد · 993 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

لدي برنامج اريد من يساعدني على فهمه

تعودت دائما على حل الطوابير بالــ struct

ولكن واجهني هذا المثال تم حله بالــ class

مالفرق بين الطريقتين؟؟

#include <iostream.h>
#define SIZE 20

class queue
{
    int *Queue, front, rear;

    public:
    queue() {
        Queue = new int[SIZE];
        front = rear = -1;
    }

    void push() {
        if (rear == (SIZE-1)) {
            cout<<"\n Overflow!";
        } else {
            rear++;
            cout<<"\n Enter element: ";
            cin>>Queue[rear];
        }
    }

    void pop() {
        if (front == rear) {
            cout<<"\n Underflow!";
        } else {
            cout<<"\nElement popped: "<<Queue[++front];
        }
    }

    void display() {
        if (front == rear) {
            cout<<"\n Queue Empty";
        } else {
            for(int i = (front+1); i<=rear; i++) {
                cout<<Queue<<" ";
            }
        }
    }
};


int main()
{
    int choice;
    queue q;
    while(choice != 4)
    {
        cout<<"\n\n Enter your choice :"
            <<"\n 1. Push an element into Queue."
            <<"\n 2. Pop an element from Queue."
            <<"\n 3. Display the Queue."
            <<"\n 4. Exit the program.\n\n";
        cin>>choice;

        switch (choice) {
            case 1:
                q.push();
                break;
            case 2:
                q.pop();
                break;
            case 3:
                q.display();
                break;
            case 4:
                break;}
                }}

تم تعديل هذه المشاركة بواسطة الدنيا حلوة في 20 نوفمبر 2012 في 14:45

#2

السلام عليكم

الكود عبارة عن محاكاة للـ Queue بالمصفوفات و ليس القوائم (التي تحتاج إلى struct أو ما شابه ..)

في البداية, قمنا بالإعلان عن ثلاث متغيرات, الأول عبارة عن مؤشر من نوع int حيث يُمثل المصفوفة التي ستُحاكي الطابور و المتغير الثاني يحمل رقم أول خانة من الطابور و المتغير الثالث يحمل رقم آخر خانة.

في دالة البناء, قمنا بحجز 20 خانة للمصفوفة Queue ثم أسندنا القيمة -1 لكل من front و rear كدلالة على فراغ الطابور.

نأتي الآن إلى الدالة push التي تقوم بإدراج العناصر في نهاية الطابور.

إذا تساوت قيمة rear مع SIZE-1 فهذا يعني أننا وصلنا إلى آخر خانة و بالتالي لا يمكننا إضافة المزيد من العناصر لذا قمنا بإظهار الرسالة OverFlow كدلالة على حدوث فيض عند محاولة الإدراج.

في الحالة المعاكسة, سنقوم بالانتقال إلى الخانة الموالية ثم نقرأ العدد المُدخل و نخزنه في الخانة الحالية.

الدالة pop تقوم بسحب العناصر من بداية الطابور.

إذا تساوت قيمة rear مع front فهذا يعني أنه لا يوجد عنصر للسحب, هذا من جهة.

من جهة أخرى, rear مع front يتساويان عند -1 فقط و من المعروف أن -1 لا يمكن أن تكون index لأحد عناصر المصفوفة لأن الترقيم يبدأ من 0 لذا قمنا بإظهار الرسالة UnderFlow كدلالة على أن index المصفوفة أقل من الصفر.

في الحالة المعاكسة, سنقوم بإظهار قيمة الخانة الحالية و الانتقال إلى الخانة الموالية (لذا أجد أن هذه المحاكاة سيئة جداً لأنه لا يتم حذف العناصر بصفة حقيقية كتحرير الذاكرة كما يحدث في القوائم).

ملاحظة :

يوجد نوعان من الفيض, إذا تجاوزت قيمة المتغير القيمة العظمى المسموح بها يحدث OverFlow و إذا تجاوزت قيمة المتغير القيمة الدنيا المسموح بها يحدث UnderFlow.

دالة الإظهار أعتقد أنها واضحة, إذا تساوت قيمة rear مع front فهذا يعني أن الطابور فارغ.

في الحالة المعاكسة, سنقوم بإظهار كافة عناصر الطابور.

بالتوفيق.

1
#3

شرحك واضح جدا :)

شكرا جزيلا

مواضيع مشابهة