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

سؤال حول ترتيب عناصر الSTACK

مغلق
بدأه فهد علي في 21 أكتوبر 2004 · 9 رد · 862 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

حقيقة عندي هذا البرنامج والذي يستخدم مجموعة من الدوال لترتيب عناصر الــSTACk

لكن مع الأسف فشلت في اكماله حتى النهاية ,, اتمنى أجد المساعده,

خصوصا أن اختباري في DataStructure يوم السبت القادم....

التركيب الذي في البرنامج هو التالي:

#define stacksize 100

struct stack{
	int stackaray[stacksize];
	int top;
	int count;
};

الدوال المستخدمة في البرنامج :

void push(struct stack* t,int x)
{
	if (t->top==stacksize-1)
	{
  printf("   \n Stack OverFlow");

	exit (1);
	}

	else

t->stackaray[++t->top]=x;


}

struct stack* Do_empty(struct stack* tt)
{
	tt->top=-1;
	return tt;

}

bool Is_empty(struct stack* s)
{
	if(s->top==-1)
  return 1;
	else
  return 0;


}

int pop(struct stack* g)
{
	if(Is_empty(g))
	{
  printf("Stack is underflow");
	}
	else
  return (g->stackaray[g->top--]);
}

المشكلة تكمن في عمل دالة ترتب عناصر الــSTACk

عملت دالة ولكن لم تؤدي الغرض منها وهاهي:

int main_2(int a,int b )
{
	if(a<b)
  return a;
	else
  return b;
}



int main_n(struct stack *t)
{
	m=t->stackaray[t->top];
	for(int i=0;i<t->top;i++)
  m=main_2(m,t->stackaray);
	return m;
}

اتمنى أجد المساعدة من الاخوة الافاضل

#2

اعتقد عندك غلط في هذه النقطه ولست متاكد

t->stackaray[++t->top]=x;

والاصح

t->stackaray[t->top++]=x;

#3

اولا أشكرك اخي الكريم على سرعة تجاوبك

لكن بخصوص مااشرت عليه فالحالتين لا تفرق الا بأضافة واحد قبل اعتماد فهرس المصفوفة او بعده.

شاكر لك ومقدر

اتمنى اجد من يلهمني لصوابي

تم تعديل هذه المشاركة بواسطة فهد علي في 21 أكتوبر 2004 في 23:15

#4

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

اخوي فهد هذا برنامج كامل كاتبته عن الstack هو مختلف عن الطريقه اللي قمت فيها لكنه صح 100%

#include<iostream.h>
#include<stdlib.h>
#include<conio.h>
class node
{
friend class stack;
private:
int data;
node *link;

};
//-----------------------
class stack
{
public:
stack(){top=0;}
int stackempty();
int pop();
void push(int dat);
void print();
private:
node *top;
};
int stack::stackempty()
{
if(top==0)return 1;
else return 0;
}
int stack::pop()
{
int t=top->data;
if(!stackempty()){
node *tmp=top;
top=top->link;
delete tmp;
return t;
}
else {cout<<"no elements to pop\n"; return 0;}
}
void stack::push(int dat)
{
node *ptr=new node;
  ptr->data=dat;
 if(top==NULL)
  {

  top=ptr;
  top->link=NULL;
  }
	else
	{
   ptr->link=top;
   top=ptr;
	}
}
void stack::print()
{
if(!stackempty()){
node *tmp;
cout<<"The stack cotents are\n";
for(tmp=top;tmp!=0;tmp=tmp->link)
cout<<tmp->data<<";";
cout<<endl;
}
else cout<<"there is no elements\n";
}

الstack هنا عباره عن classومحتواها مخزن في node

اتمنى ان هذا الحل يفيدك واعذرني اذا ما قدرت اعدل على حلك واشوف فوين الغلط فانا ماخذه datastructer من زمان وهذا حلى محتفظه فية حبيت افيدك فيه

الله يوفقك .. كتكوته

Stack.txt

#5

شاكر ومقدر اختي كتكوتة على محاولتك للافادة

عموما البرنامج من نظرتي الاولية أرى انه استخدم LIST

وأنا لم أستطع الاكمال حتى النهاية وهو بدون LIST

أنا في الحقيقة عملت البرنامج ولكن في النهاية حصل عندي هذا الخطأ لكل دالة من الدوال التي في البرنامج

#include<stdio.h>
#include<stdlib.h>

#define stacksize 50

struct stack{
	int stackaray[stacksize];
	int top;
	int count;
};


struct stack* Do_empty(struct stack* tt);
bool Is_empty(struct stack *s);
void push(struct stack *t,int x);
int pop(struct stack *g,int *data);
int main_2(int a,int b);
struct stack * GG(struct stack t);


void main()
{

	struct stack f,g;
	int x[stacksize];
	int n=0;
	Do_empty(&f);
	Do_empty(&g);


	printf("please enter set of numbers ");



	//


	for(int i=0;;i++)
	{


  scanf("%d",&x);
  if(x !=9999)
  {
 	 push(&f,x);
 	 n++;
  }
  else
 	 break;


	} //end for




	GG(f);
	for(i=0;i<(g.top);i++)
	{
  
  printf("aranged : %d",(g.stackaray[g.top]));



}











struct stack* Do_empty(struct stack* tt)
{
	tt->top=-1;
	return tt;

}



bool Is_empty(struct stack* s)
{
	if(s->top==-1)
  return 1;
	else
  return 0;


}



void push(struct stack* t,int x)
{
	if (t->top==stacksize-1)
	{
  printf("   \n Stack OverFlow");

	exit (1);
	}

	else

t->stackaray[++t->top]=x;


}

/*
int pop(struct stack* g)
{
	if(Is_empty(g))
	{
  printf("Stack is underflow");
	}
	else
  return (g->stackaray[g->top--]);
}
*/

int pop(struct stack *g,int *data)
{
	if(g->count==0)
  return 0;

	*data=g->stackaray[g->top];
	(g->count)--;
	(g->top)--;
	return 1;
}



int main_2(int a,int b)
{
	if(a<b)
  return a;
	else
  return b;
}


//int main_n(int





struct stack * GG(struct stack t)
{

	struct stack *g;
	int ar[stacksize];

	for(int i=0;i<stacksize;i++)
  ar=pop(&t,&ar);

	for( i=0;i<stacksize; i++)
	{
  for(int j=0;j<stacksize;j++)
  {
 	 int m=ar;
 	 m=main_2(m,ar[j]);
 	 push(&g,m);
  }
	}
	return g;
}

الخطاظهر ويدل على ان نهاية الدوال هي نهاية غير شرعية حقيقة لم استطع أن اعرف ما يدل على هذا الخطأ

اتمنى اجد من يفسر لي معنى هذا الخطا:

local function definitions are illegal

تم تعديل هذه المشاركة بواسطة فهد علي في 22 أكتوبر 2004 في 16:55

#6

السلام عليكم

ليس لدى كمبايلر سى كى اجرب لكن اظن ان هناك خطاء فى الاقواس, فى من الظاهر انك لم تغلق قوس ال main والكمبالير يجد function جديد قبل إغلاق القوس, واظن هذا هو سبب الخطاء المكرر لديك. فقط نسق الاقوس وستحل المشكله إن شاء الله.

والسلام

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#7

بارك الله فيك اخي احمد بالفعل كان ينقص في النهاية قوس الاغلاق لــmain

فبعد ان نفذت البرنمج لم تظهر أية اخطاء ولكن بعد أن تضهر شاشة الدوس

واتسلسل في تنفيذ الاوامر

تضهر لي رسالة خطأ وتجبرني من الخروج من الدوس.

رسالة الخطأ تظهر عندما أدخل شفرة الخروج 9999 من حلقة التكرار for .

جزاكم الله عني خير الجزاء

#8

السلام عليكم

هناك خطاء منطقى فى الكود لاحظ الاتى:

for(int i=0;;i++)
{


 scanf("%d",&x);
 if(x !=9999)
 {
  push(&f,x);
  n++;
 }
 else
  break;


} //end for

فى هذا الكود تدخل مجموعه من العناصر فى الاستاك, وبعد الانتهاء من ذالك تحاول الاتى:

struct stack * GG(struct stack t)
{

struct stack *g;
int ar[stacksize];

for(int i=0;i<stacksize;i++)
 ar=pop(&t,&ar);

for( i=0;i<stacksize; i++)
{
 for(int j=0;j<stacksize;j++)
 {
  int m=ar;
  m=main_2(m,ar[j]);
  push(&g,m);
 }
}
return g;
}

وهذا يؤدى إلى محاولة إخراج 50 عنصر من الاستاك حتى إذا كان عدد العناصر اقل من 50, من ما يؤدى إلى محاولة القرائه من ذاكر غير معروفه وكما تعلم القرائه من ذاكره غير معروفه يجل البرنامج يتصرف بطريقه عشوائيه.

عليك اولاً ان تحل مشكلة هذين السطرين:

for(int i=0;i<stacksize;i++)
 ar=pop(&t,&ar);

وذالك بعمليه test لمحتوى الاستاك على النحو التالى :

if is_embty(*t)
return 0;

او شئ من هذا القبيل .

والسلام

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#9

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

أشكرك أخي أحمد جزيل الشكر وأشكر أيضا باقي الاخوة

حقيقة من خلال ما سبق اتضحت لي أمور لم أكن ألقي لها بالا

جزاكم الله عني خير الجزاء وجعلني واياكم من المقبولين في هذا الشهر الفضيل

عن قريب ان شاءالله سأضع البرنامج كاملا باستخدام الــSTACK وباستخدام الــQUEUE

لعل يكون هناك من ينتفع منه

تمنياتي لكم بالتوفيق

اخوكم فهد

#10

السلام عليكم

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

والسلام

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

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

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…