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

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

مغلق
بدأه The Cpp في 29 ديسمبر 2005 · 13 رد · 1,308 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

مثال

stack1: 1 6 8 4 5
stack2: empty

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

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

int pop()

تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 18 أبريل 2014 في 18:49 — السبب: add some tags

abofahad5515@hotmail.com

#2

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

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

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

stackcopy

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

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

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

تم تعديل هذه المشاركة بواسطة Asm4all في 29 ديسمبر 2005 في 20:35

#3

بالضبط هذا هو المطلوب

abofahad5515@hotmail.com

#4

وهذا هو تعريف الكلاس 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);

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

abofahad5515@hotmail.com

#5

السلام عليكم

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

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

#6

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

اليك الحل

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 في 30 ديسمبر 2005 في 04:06

#7

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

abofahad5515@hotmail.com

#8

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

#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 في 31 ديسمبر 2005 في 13:03

#9

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

#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 في 31 ديسمبر 2005 في 15:12

#10

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

abofahad5515@hotmail.com

#11

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

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

شوية وراجع

#12
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 في 2 يناير 2006 في 17:42

#13

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

abofahad5515@hotmail.com

#14

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

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

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

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