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

أسئلة في stack ...

بدأه طــآلبة حآسب آلي . في 9 مايو 2011 · 6 رد · 3,335 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السسلام عليكم ي اخوان

ممكن حد يصحح لي أخطآءي بهالبرنامجين ..

عندي اختبار في الغد وللأسف مو راضي يتطبق معي صحيح ..

الأول باستخدام single linkedlist

#include <iostream.h>


// global variables declation
struct stack 
{ int  info;
   struct stack *next;
};

class stack1
{ private:
	   stack *Top;
    int item;

public:

	stack1 () {Top = NULL;}  // constructor, which automatically executes when object of the class will be created




	void Push(int item)
		{
		cout<<"enter number";
		cin>>item;
			  stack *Newnode = new stack;
			Newnode-> info = item;
			Newnode-> next = NULL;
			if(Top == NULL) Top = Newnode;
			else
			{ Newnode -> next = Top; Top = Newnode; }
		}

	int Pop( )
		{  struct stack *t;
	       item = Top - > info;
		   t = Top;
			Top = Top ->next;
			delete t;
			return item;
		}

	bool IsEmpty( )
		{ if(Top == NULL ) return true; else return false; }

	void Traverse( )
		{  stack *TopTemp = Top;
			do{ cout<<TopTemp->info<<endl; TopTemp = TopTemp->next;} while(TopTemp!= NULL 0);
		}
}; //  end of the class





int main( )
{ 
	stack1  z;  // Creation of an object
 z.Push();
 z.Pop();
 z.Traverse();
     return 0;
}

وهذا الثاني بتمثيل الstack كمصفوفة ..

 
#include <iostream.h>

 int const STACKSIZE =10;

class stack1
{ private:
	int Top;
    int Stack[STACKSIZE];
    int item;

public:	
	stack1 () {Top = -1;}  // constructor, which automatically executes when object of the class will be created

	void Push()
		{int item;
	cout<<":::";
	cin>>item;
	if (IsFull())
		cout<<"NO";
	else {
		Stack[++Top] = item;}
		}

	void Pop( )
		{if (IsEmpty())
		cout<<"UNDER";
	else {
		Stack[Top--];
	}
		}

	bool IsEmpty( )
		{ if(Top == -1 ) return true; 
	else return false; }

	bool IsFull( )
		{ if(Top == STACKSIZE-1 ) return true;
	else return false; }

	void Traverse( )
		{ int TopTemp = Top;
			do{
				cout<<Stack[TopTemp--];
			} 
			while(TopTemp>= 0);
		}
}; //  end of the class





int main( )
{ 
	stack1  ms;  // Creation of an object

            ms.Push();
			 ms.Pop();
			  ms.Traverse();


     return 0;
}

وعندي بعض الأسئلة : )

- لو مثلت المكدس بشكل double linked list هل استطيع ان احذف من الاخير ..؟

- ولو كان عندك مكدسين وبنعمل لهم دمج فهل هذا الشي ممكن ..؟

- وكيف استطيع ان احذف قيمة واحفظها في مكدس اخر بمعنى

القيمة التي احذفها من المكدس الأول ادخلها بالمكدس الثاني ؟

- وهل يمكنني ان اطبع عناصر stack بطريقة عكسية ؟ كيف ؟ :(

ولو تكرم احد وشرح لي طريقة التحويل من prefix to infix

اكون شاكرة له . وداعية له بالتوفيق والفلاح في الدارين ..:)

أريد عونكم يااخوان باسرع وقت

جزاكم الله خيرا ..

تم تعديل هذه المشاركة بواسطة طــآلبة حآسب آلي . في 9 مايو 2011 في 22:17

#2

الا يوجد احد يجيب على اي من استفساراتي :؟

:(

#3

هناك اخطاء بسيطة:

* في الكود الاول ووصفتي push بالخطأ حيث انك طلبتي منه ان يقبل قيمة int بينما المفروض لا يقبل شيء (لانه يقبلها من cin)

* نسيتي using namespace std

بعدها طبيعي يحدث segmentation fault لانك تقومين بpop قبل traverse...

يعني traverse مضطرة ان تبحث في memory ليس allocated بعد.. وهكذا نظام التشغيل (على الاقل عندي) يقوم بقتل البرنامج بحجة segmentation fault

الكود الاول:

#include <iostream>

using namespace std;

// global variables declation
struct stack 
{ int  info;
   struct stack *next;
};

class stack1
{ private:
    stack *Top;
    int item;

public:

        stack1 () {Top = NULL;}  // constructor, which automatically executes when object of the class will be created

        void Push()
                {
					cout<<"enter number";
					cin>>item;
					stack *Newnode = new stack;
					Newnode-> info = item;
					Newnode-> next = NULL;
					if(Top == NULL) Top = Newnode;
					else
					{ Newnode -> next = Top; Top = Newnode; }
                }

        int Pop( )
                {  struct stack *t;
               item = Top -> info;
                   t = Top;
                        Top = Top ->next;
                        delete t;
                        return item;
                }

        bool IsEmpty( )
                { if(Top == NULL ) return true; else return false; }

        void Traverse()
                {  stack *TopTemp = Top;
                        do{ 
							cout<<TopTemp->info<<endl; 
							TopTemp = TopTemp->next;
						}
						while(TopTemp != NULL);
                }
}; //  end of the class


int main()
{ 
	stack1  z;  // Creation of an object
	z.Push();
	//cout<<z.Pop()<<endl;
	z.Traverse();
	return 0;
}

الكود الثاني:

#include <iostream>

using namespace std;

 int const STACKSIZE =10;

class stack1
{ private:
        int Top;
    int Stack[STACKSIZE];
    int item;

public: 
        stack1 () {Top = -1;}  // constructor, which automatically executes when object of the class will be created

        void Push()
                {int item;
        cout<<":::";
        cin>>item;
        if (IsFull())
                cout<<"NO";
        else {
                Stack[++Top] = item;}
                }

        void Pop( )
                {if (IsEmpty())
                cout<<"UNDER";
        else {
                Stack[Top--];
        }
                }

        bool IsEmpty( )
                { if(Top == -1 ) return true; 
        else return false; }

        bool IsFull( )
                { if(Top == STACKSIZE-1 ) return true;
        else return false; }

        void Traverse( )
                { int TopTemp = Top;
                        do{
                                cout<<Stack[TopTemp--];
                        } 
                        while(TopTemp>= 0);
                }
}; //  end of the class





int main( )
{ 
	stack1  ms;  // Creation of an object

	ms.Push();
	//        ms.Pop();
	ms.Traverse();  
	return 0;
}

س- لو مثلت المكدس بشكل double linked list هل استطيع ان احذف من الاخير ..؟

ج: المكدس يعني stack؟ انت لا تمثلينه.... الstack مكان في memory يتم فيه تغزيين variables. هناك ايضا heap مكان آخر تستخدمينه بواسطة malloc + free... لاحظت انك تستخدمين delete لحذف متغيرات في stack، لماذا؟ هذا يتم بشكل اوتوماتيكي. لو كنتي تريدين افضاء متغيرات في heap وقتها سيكون منطقيا.

س- ولو كان عندك مكدسين وبنعمل لهم دمج فهل هذا الشي ممكن ..؟

ج: هناك stack واحد لكل process.. لكن اذا تقصدين linked-list لمتغيرات في heap فنعم ممكن تدمجينهم واعادة ترتيبهم و حذف بعضهم...الخ.

س- وكيف استطيع ان احذف قيمة واحفظها في مكدس اخر بمعنى القيمة التي احذفها من المكدس الأول ادخلها بالمكدس الثاني ؟

ج: لا يوجد مكدس - stack - آخر بل وفقط مكدس واحد.. لكن اذا تقصدين linked-list (والذي لا يسمى "مكدس") فممكن بطرق عديدة احداهم ان تقومي بtraverse كما فعلتي في كودك بالاعلى، وعلى كل element في الlinked list تقومين بpush في linked list اخرى (ايضا كما فعلتي بكودك بالاعلى).

س- وهل يمكنني ان اطبع عناصر stack بطريقة عكسية ؟ كيف ؟ :(

ج: تغيير الترتيب الحقيقي لعناصر الstack غير ممكن الا إذا غيرتي الcompiler نفسه وهذا اختيار غير وارد عندك.... لكن تغيير "طباعة" العناصر فنعم ممكن. المسألة هي فقط sorting. هناك عدة algorithms للsorting سواء تصاعدي ولا تنازلي

س: ولو تكرم احد وشرح لي طريقة التحويل من prefix to infix

ج: http://www.cs.man.ac.uk/~pjj/cs212/fix.html

1

ملاحظة: يوجد

أعضاء في قائمة تجاهلي. لذا عدم ردي عليهم لا يدل على موافقتي الضمية لمحتويات مشاركاتهم.

sigsubway.png

#4

في كلا الكودين لايدخل لي الا عدد واحد فقط .؟

هل تشرح لي السبب ..

شاكرة تعاونك ي اخي .

والحمد لله انتهى اختباري على أحسن مايرام .. .

لدي خطأ بسيط جدا ,ولكن الحمد لله . العوض في القادم ..

#5

السبب هو انك تقومين بـcin مرة واحدة فقط

ملاحظة: يوجد

أعضاء في قائمة تجاهلي. لذا عدم ردي عليهم لا يدل على موافقتي الضمية لمحتويات مشاركاتهم.

sigsubway.png

#6
#include <iostream> 

using namespace std; 

 int const STACKSIZE =10; 

class stack1 
{ private: 
        int Top; 
    int Stack[STACKSIZE]; 
    int item; 

public:  
        stack1 () {Top = -1;}  // constructor, which automatically executes when object of the class will be created 

        void Push() 
                {int item,i=0; 
		while(i<STACKSIZE){
        cout<<":::"; 
        cin>>item; 
        if (IsFull()) 
                cout<<"NO"; 
        else { 
                Stack[++Top] = item;} 
                } 
		i++;
		}
        void Pop( ) 
                {if (IsEmpty()) 
                cout<<"UNDER"; 
        else { 
                Stack[Top--]; 
        } 
                } 

        bool IsEmpty( ) 
                { if(Top == -1 ) return true;  
        else return false; } 

        bool IsFull( ) 
                { if(Top == STACKSIZE-1 ) return true; 
        else return false; } 

        void Traverse( ) 
                { int TopTemp = Top; 
                        do{ 
                                cout<<Stack[TopTemp--]; 
                        }  
                        while(TopTemp>= 0); 
                } 
}; //  end of the class 





int main( ) 
{  
        stack1  ms;  // Creation of an object 

        ms.Push(); 
        //        ms.Pop(); 
        ms.Traverse();   
        return 0; 
}

اهاا . شكرا لك صححت كود تمثيل الستاك بالمصفوفة ,,

لكن نسيت الكود هنا ضروري switch انتبهت انه مايسوي pop صحيح ؟

#7

ليس يسوي pop لانه سابقا كان يؤدي إلى segmentation fault

لذا جعلته commented

//        ms.Pop();

شيلي الكومنت وسيحاول ان يقوم بpop

ملاحظة: يوجد

أعضاء في قائمة تجاهلي. لذا عدم ردي عليهم لا يدل على موافقتي الضمية لمحتويات مشاركاتهم.

sigsubway.png

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