• 0
The Cpp

لغز متوسط حول المكدسات

سؤال

أتمنى ما يكون متكرر وهو :
نريد كتابة دالة تنسخ stack of integers إلى stack أخرى بحيث لا يمكن تعريف أي متغير في الدالة غير هذه المتغيرات وهي :
3 أعداد صحيحة (فقط)

مثال

stack1: 1 6 8 4 5stack2: emptyafter the function that take the two stacks as a parameter  (you can use in the function only three integers) stack1: 1 6 8 4 5stack2: 1 6 8 4 5

ملاحظة : رأس الدالة pop بالشكل التالي:

int pop()
تم تعديل بواسطه مصطفى 36a2
add some tags
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

13 إجابة على هذا السؤال .

  • 0

يا ريت توضيح اكثر , يعني انت بتطلب كلاس اسمها stack مثلا نعمل منها كائنين واحد نضع به ارقام والآخر فارغ ونريد نسخ البيانات فيه من الكائن الأول ؟ , بحيث ان شكل الكلاس بهذا الشكل :

class Stack {
public:
 void push(int);
 int    pop(void);
};

والمطلوب مني مثلا دالة بهذا الشكل

stackcopy

بحيث انها لا تحتوي على أكثر من ثلاث متغيرات ؟

هل هذا الكلام صحيح أم انه بعيد عما تطلبه ؟

أصل الموضوع مش واضح شوية

تم تعديل بواسطه Asm4all
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

وهذا هو تعريف الكلاس stack وكيفية استخدامه :

#include <iostream>
using namespace std;

class node
{
public:
int data;
node* next;
node(int d,node *n = 0)
{
 data = d;
 next = n;
}
};

class stack
{
node *top;
public:

stack()
{
 top = 0;
}

bool empty()
{
 return top==0;
}

void push(int d)
{
 top = new node(d,top);
}

int pop()
{
 if(empty())
 return -1;
 int d;
 node *p = top;
 d = p->data;
 top = top->next;
 delete p;
 return d;
}

void print()
{
 node *p = top;
 while( p!= 0)
 {
 cout << p->data << " ";
 p = p->next;
 }
 cout << endl;
}
};
int main()
{
stack s;
s.push(5);
s.push(3);

int x = s.pop();
s.print();
cout <<"x =" << x << endl;

return 0;
}

وراح يكون رأس الدالة بالشكل هذا

void CopyStack(stack &s1,stack &s2);

اتمنى اني وفقت في توضيح الفكرة ..

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

ارجع البيت بس وابعتلك البرنامج , أنا كنت تقريبا خلصته , لكن جالي مشوار وخرجت ووانا بره دخلت نت

كلها ساعه او ساعتين ان شاء الله

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

هههههه , القعدة طولت ويا دوب رجعت

اليك الحل

void CopyStack(Stack &src, Stack &dst) {
 int i, j, k;
 for(i = 4; i >= 0; i--) {
   for(j = i; j > 0; j--)
     dst.push(src.pop());
   k = src.pop();
   src.push(k);
   for(j = i; j > 0; j--)
     src.push(dst.pop());
   dst.push(k);
 }
}

الكود كله , بم فيه تصميم للكلاس Stack كنت عملته قبل ما تطرح الكلاس الجاهزة

#include <iostream>
#include <conio.h> // for getch()
using namespace std;
class Stack {
private:
 int *arr, max, pos;
public:
 Stack(int size) : max(size) , pos(size){
   arr = new int[size];
 }
 ~Stack() {
   delete [] arr;
 }
 void push(int arg);
 int  pop(void);
};
void CopyStack(Stack &src, Stack &dst);
int main (void) {
 Stack s1(5), s2(5);
 s1.push(5);
 s1.push(4);
 s1.push(3);
 s1.push(2);
 s1.push(1);
 CopyStack(s1, s2);
 cout << s1.pop() << endl;
 cout << s1.pop() << endl;
 cout << s1.pop() << endl;
 cout << s1.pop() << endl;
 cout << s1.pop() << endl << endl;
 cout << s2.pop() << endl;
 cout << s2.pop() << endl;
 cout << s2.pop() << endl;
 cout << s2.pop() << endl;
 cout << s2.pop() << endl;
 getch();
 return(0);
}
void Stack::push(int arg) {
 if(pos > 0)
   arr[--pos] = arg;
}
int Stack::pop(void) {
 if(pos < max)
   return arr[pos++];
 else
   return -1;
}
void CopyStack(Stack &src, Stack &dst) {
 int i, j, k;
 for(i = 4; i >= 0; i--) {
   for(j = i; j > 0; j--)
     dst.push(src.pop());
   k = src.pop();
   src.push(k);
   for(j = i; j > 0; j--)
     src.push(dst.pop());
   dst.push(k);
 }
}

تم تعديل بواسطه Asm4all
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أتمنى يكون الحل شامل أقصد ما هو العدد ( 4 ) .. وأنصحك باستخدام تعريف الكلاس المعطى كي تستفيد من الدالة empty وشكرا على المشاركة

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

طيب ينفع أعدل في الكلاس ولا ممنوع ؟؟

#include <iostream>
#include <conio.h> // for getch()
using namespace std;
class node {
public:
 int data;
 node* next;
 node(int d,node *n = 0) {
   data = d;
   next = n;
 }
};
class stack {
 node *top;
 int  numofnodes;
public:
 stack() : top(0), numofnodes(0){
 }
 bool empty() {
   return top==0;
 }
 void push(int d) {
   top = new node(d,top);
   numofnodes++;
 }
 int pop() {
   if(empty())
     return -1;
   int d;
   node *p = top;
   d = p->data;
   top = top->next;
   delete p;
   numofnodes--;
   return d;
 }
 void print() {
   node *p = top;
   while( p!= 0) {
     cout << p->data << " ";
     p = p->next;
   }
   cout << endl;
 }
 int size(void) {
   return numofnodes;
 }
};
void CopyStack(stack &src, stack &dst) {
 int i, j, k;
 for(i = src.size() - 1; i >= 0; i--) {
   for(j = i; j > 0; j--)
     dst.push(src.pop());
   k = src.pop();
   src.push(k);
   for(j = i; j > 0; j--)
     src.push(dst.pop());
   dst.push(k);
 }
}
int main(void) {
 stack s1, s2;
 s1.push(5);
 s1.push(4);
 s1.push(3);
 s1.push(2);
 s1.push(1);
 CopyStack(s1, s2);
 s1.print();
 s2.print();
 getch();
 return(0);
}

لو مينفعش , نعمل كلاس جديده بتورث من القديمة ونضيف عليها التعديلات ونستخدم الجديدة

تم تعديل بواسطه Asm4all
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

الكود بالوراثة

#include <iostream>
#include <conio.h> // for getch()
using namespace std;
class node {
public:
 int data;
 node* next;
 node(int d,node *n = 0) {
   data = d;
   next = n;
 }
};
class stack {
 node *top;
public:
 stack() : top(0) {
 }
 bool empty() {
   return top==0;
 }
 void push(int d) {
   top = new node(d,top);
 }
 int pop() {
   if(empty())
     return -1;
   int d;
   node *p = top;
   d = p->data;
   top = top->next;
   delete p;
   return d;
 }
 void print() {
   node *p = top;
   while( p!= 0) {
     cout << p->data << " ";
     p = p->next;
   }
   cout << endl;
 }
};

class MyStack : public stack {
 int  numofnodes;
public:
 MyStack() : stack() , numofnodes(0) {
 }
 ~MyStack() {
 }
 void push(int value) {
   numofnodes++;
   stack::push(value);
 }
 int pop(void) {
   numofnodes--;
   return stack::pop();
 }
 int size(void) {
   return numofnodes;
 }
};
void CopyStack(MyStack &src, MyStack &dst) {
 int i, j, k;
 for(i = src.size() - 1; i >= 0; i--) {
   for(j = i; j > 0; j--)
     dst.push(src.pop());
   k = src.pop();
   src.push(k);
   for(j = i; j > 0; j--)
     src.push(dst.pop());
   dst.push(k);
 }
}
int main(void) {
 MyStack s1, s2;
 s1.push(5);
 s1.push(4);
 s1.push(3);
 s1.push(2);
 s1.push(1);
 CopyStack(s1, s2);
 s1.print();
 s2.print();
 getch();
 return(0);
}

تم تعديل بواسطه Asm4all
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

يا عزيزي ِAsm4all يمنع التعديل والوراثة لأنك سوف تستخدم عدد صحيح بداخل الكلاس فسوف تزيد الأعداد الصحيحة إلى 4 وشكرا على المشاركة وأنتظر حلك

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

عموما , انا عندي فكرة , هاشوفها و اجيبها هي تغيير بسيط في الدالة لكن تقريبا نفس الكود

شوية وراجع

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
void CopyStack(stack &src, stack &dst) {
 int i = 0, j = 0, k = 0;
 while(!src.empty()) {
   dst.push(src.pop());
   j++;
 }
 if(j == 0) return; // في حالة ما تكون الـستاك فارغة
 while(!dst.empty())
   src.push(dst.pop());
 for(i = j - 1; i >= 0; i--) {
   for(j = i; j > 0; j--)
     dst.push(src.pop());
   k = src.pop();
   src.push(k);
   for(j = i; j > 0; j--)
     src.push(dst.pop());
   dst.push(k);
 }
}

تم تعديل بواسطه Asm4all
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

الحل ممتاز وأشكرك على المشاركة واذا حصلت انت أي لغز انا في الانتظار وشكرا على المشاركة

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

يوجد تعديل بسيط , لحل مشكلة تحدث في حالة ما تكون الـ stack فارغة ( كل شيء وارد )

ان شاء الله سوف ابحث عن بعض الفوازير والخدع الجميلة , خاصة الخاصة بكفائة الكود وحجمة , فانا اعشق هذا النوع من الفوازير :D

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .