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

كيف عمل function Sort ل Queue ؟؟!

مغلق
بدأه sahs في 8 ديسمبر 2005 · 6 رد · 1,171 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

انا طالب جامعي ادرس حالياً data structure

طُلب مني عمل function Sort خارج لQueue

void Sort(Queue &q)

عمل الفنكشن :

تقوم باستقبال queue يوجد فيه ارقام من نوع انتجر ... ثم تقوم بترتيبهم من الاصغر إلى الاكبر او العكس

حاولت كثيراً لكني لم افلح

حاولت ان تقوم الالفنكسن بنسخ الارقام إلى arrays ثم ترتبهم وتعيدهم إلى الQueue ... واجهت مشكلة في ان سعت الarrays غير محددة

حاولت باستخدام طريقة Recursion Function ... لكن لم افلح في اتقانها

آخر محاوله لي كانت هذه ...

void sort(Queue &Q){
	Queue temp;

	int max,n;
	Q.getFront(max);
	Q.remove();
	while(!Q.isEmpty()){
  Q.getFront();
  while(!Q.isEmpty()){
  	Q.getFront(n);
  	Q.remove();
  	if(n>max){
    Q.add(max);
    max=n;
  	}
  	else
    Q.add(n);
  }

  temp.add(max);
  Q.getFront(max);
  Q.remove();

}

لكن واجهتني مشكلة الloop  الداخلي كيف إيقافه ؟؟!

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

هذا كود الqueue

#include<iostream.h>

const int size=50;

typedef int itemType;

class Queue {
private :
	itemType item[size];
	int Front,rear,count;
public :
	Queue(){Front=0;rear=size-1;count=0;}
	Queue(Queue &q);

	//void getCounters(int &front,int &rear,int &count,const itemType* &q)

	int isEmpty(){return (count==0);}
	int isFull(){return (count==size);}

	void Print();

	int add(itemType);
	int remove();
	int getFront(itemType &);

};


void Queue::Print(){
	if(isEmpty())
  cout<<"Empty Queue";

	int i,index;
	for(i=1,index=Front;i<=count;i++,index=(index+1)%size)
  cout<<item[index]<<endl;
}



int Queue::add(itemType newitem){
	if(isFull())
  return 0;
	rear=(rear+1)%size;
	item[rear]=newitem;
	++count;
	return 1;
}

int Queue::remove(){
	if(isEmpty())
  return 0;
	count--;
	Front = (Front+1)%size;
	return 1;
}

int Queue::getFront(itemType &frontitem){
	if(isEmpty())
  return 0;
	frontitem = item[Front];
	return 1;
}

Queue::Queue(Queue &q){
	Queue tQ;
	itemType tI;

	while(q.getFront(tI)){
  tQ.add(tI);
  q.remove();
	}

	while(tQ.getFront(tI)){
  q.add(tI);
  tQ.remove();
	}
}

ملاحظة :

لقد قرأة "قواعد طرح المواضيع "

انا لا اطلب منكم حل لي هذه function ... ولا طلب كودها

لكن اطلب مساعدتي في الفكرة اللتي يمكن الحل بها

والسلام عليكم ورحمة الله وبركاته

تم تعديل هذه المشاركة بواسطة sahs في 8 ديسمبر 2005 في 12:08

#2

و عليكم السلام و رحمة الله و بركاته,

أهلا بك معنا,

الاحظ ان الـ implementation الخاصة بالـ Queue تستخدم array لتخزين الـ queue

الا تستطيع ترتيب الـ array نفسه؟

تستطيع اضافة member function من أجل الحصول على الـ array و يمكنك قطعا معرفة حجمه, لأنه constant

const int size=50;

typedef int itemType;

class Queue {
private :
itemType item[size];
.
.
.

انت قلت:

اقتباس
حاولت ان تقوم الالفنكسن بنسخ الارقام إلى arrays ثم ترتبهم وتعيدهم إلى الQueue ... واجهت مشكلة في ان سعت الarrays غير محددة

هلا وضحت؟

الـ queue في النهاية لا بد ان تكون قادرا على تحويله الى array, حتى لو كان circular queue

بالنسبة لحجم الـ array, فالمصفوفات arrays في لغة السي و السي بلص بلص ليس لها احجام أصلا .. مجرد مؤشر الى بداية الـ array, و حجم الـ array هو دائما implicit, بمعنى أنك كمبرمج تعرف ان هناك حجما محددا للـ array, و لكن لا يوجد شي في اللغة يمنعك من تجاوز هذا الحجم.

#3

شكراً اخ hasan_aljudy على الرد السريع

اخي الfunction المطلوبه ليست لها علاقة بنوع الqueue كانت arrays لو Pointer

المطلوب ان تكون function خارج class وليست بداخله

إي انها تستعمل functions الموجودة داخل class لعمل تسلسل للارقام

اما عن الarrays فقد كانت حيله لا اعتقد انها ستكون مقبوله

المطلوب استخدام

(add,remove,getfront,isEmpty,isfull,......)

وشكراً

#4

طيب اذا, في هذه الحالة, يمكن عمل شي بسيط مثل:

قم بعمليات remove (او pop) لجميع عناصر الـ queue بحيث تضعها في array منفصل, قم بترتيب الـ array المنفصل, ثم اعد العناصر الى الـ queue عن طريق عمليات add متتالية.

هل هذا ايضا يعتبر تحايل؟ لا اظن ذلك, لان الـ queue لا تستطيع القيام بشيء فيه سوى add او remove, و الطريق الوحيدة لترتيب العناصر هي اضافتها او عمل add لها بشكل مرتب .. و الطريق الوحيدة لفعل ذلك هي عمل اكثر من remove واحدة لاخذ عدة عناصر, ترتيب هذه العناصر, ثم ارجاعها الى الـ queue عن طريق add.

يمكن اعتماد طريقة أخرى, عن طريق تنفيذ نسخة "محرفة" من الـ merge sort, بحيث تقوم باخذ كل عنصرين من الـ queue و ترتيبهما, ثم عمل add لهما بشكل مرتب, و هكذا الى ان تفعل ذلك على جميع العناصر,

ثم تاخذ كل اربع عناصر و تربتها, ثم تاخذ كل ثمانية عناصر و ترتبها .. الخ .. ثم تاخذ n عناصر لترتبها, و تتوقف عندما تكون n اكبر من حجم الـ queue.

و لكن في هذه الطريقة سنقوم ايضا بترتيب العناصر على array منفصل قبل ان تقوم بإعادتها الى الـ queue

ملاحظة: انا افترض ان remove هي مثل pop, بحيث انها تقوم بقراءة اول عنصر و الغائه من الـ queue

#5

السلام عليكم ...

لقد قمت بعمل الfunction ... بكن هناك مشكلة في size الarray

void sort2(Queue &Q){
	Queue temp=Q;

	int count=0;
	//لمعرفة عدد الارقام في queue
	while(!temp.isEmpty()){
  count++;
  temp.remove();
	}

	int arr[count];
	int n;
                // للنسخ من queue إلى  array
	for(int i=count;i<count,!Q.isEmpty();i++,Q.remove()){
  Q.getFront(n);
  arr=n;
	}

}

لم اكملها بسبب ظهور هذه الاخظاء

error C2057: expected constant expression

error C2466: cannot allocate an array of constant size 0

error C2133: 'arr' : unknown size

جميعها تأشر على int arr[count];

عندما اقوم بجذف count إي int arr[];

يبقى هذا الخظء

error C2133: 'arr' : unknown size

الطريقة الثاني لم افهمها ... ربما لم ندرسها إلى الآن

#6

اذا كنت تريد تحددي حجم المصفوفة بمتغير فهذا الامر سيحدث أثناء تشغيل البرنامج .. و هو امر غير مسموح به بالطريقة التقليدية, بل يجب استخدام new من اجل حجز مساحة اثناء تشغيل البرنامج

int arr[] = new arr[count];

// OR

int * arr = new arr[count];
#7

السلام عليكم ....

هذا الخطء عن اضافة

int arr[] = new arr[count];

: error C2061: syntax error : identifier 'arr'

على العموم اخي الكريم ... hasan_aljudy شكراً لمساعدتك

فقد توصلة إلى حل لهذه الfunction ..

void sort(Queue &Q){
	Queue temp1;
	Queue temp2;
	int count=0;

	while(!Q.isEmpty()){
  count++;
  int r;
  Q.getFront(r);
  temp2.add(r);
  Q.remove();
	}


	int max,n;
	Q.getFront(max);
	Q.remove();
	while(!temp2.isEmpty()){
  int i=0;
  while(i!=count){
  	temp2.getFront(n);
  	temp2.remove();
  	i++;
  	if(n>=max){
    temp2.add(max);
    max=n;
  	}
  	else
    temp2.add(n);
    
  }


  temp1.add(max);
  temp2.getFront(max);
  temp2.remove();
  count--;
	}

	while(!temp1.isEmpty()){
  int m;
  temp1.getFront(m);
  Q.add(m);
  temp1.remove();
	}

	cout<<"Queue is sorted"<<endl;
	Q.Print();

}

تم تعديل هذه المشاركة بواسطة sahs في 9 ديسمبر 2005 في 23:23

هذا الموضوع مغلق.

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