PDA

View Full Version : پشته های چندگانه در c++



nazi73
یک شنبه 12 آبان 1392, 17:40 عصر
سلام

دوستان من یه سوال در مورد پشته های چندگانه داشتم...

راستش من واقعا در مورد پشته های چندگانه گیج شدم! اگه بخوایم عملیات روی هر کدوم از این پشته ها انجام بدیم مثل push یا pop یا ... باید چند تا تابع تعریف کنیم؟

مثلا فرض کنیم سه تا پشته داریم الان من برای هر کدوم از این پشته ها باید یه تابع تعریف کنم؟ مثلا push1 , push2, push3 ؟
یا اگه نه چیکار باید بکنم؟

من الان یه برنامه تو C++‎ نوشتم که مثلا برای هر کدوم از پشته ها یه تابع مخصوص به اون رو نوشتم. اما اینجوری کد تکراری زیاد میشه تو برنامم. میشه راهنماییم کنید با یه مثال؟

خیلی لازمش دارم... ممنون میشم راهنماییم کنید

returnx
یک شنبه 12 آبان 1392, 18:09 عصر
باید کدتون را بصورت شی گرا پیاده کنید ، یعنی یک کلاس پشته تعریف کنید و بعد از اون کلاس چند شی بسازید...

nazi73
یک شنبه 12 آبان 1392, 18:12 عصر
میشه روی یه قسمتی از این کدی که من نوشتم توضیح بدید؟

ببینید این کد منه:

#include <iostream>
using namespace std;
#define Max 50
class stack
{
private:
int a[Max],b[Max],c[Max];
int sp1,sp2,sp3;
public:
stack();
int IsEmpty1();
int IsEmpty2();
int IsEmpty3();
int IsFull1();
int IsFull2();
int IsFull3();
void Push1();
void Push2();
void Push3();
int Pop1();
int Pop2();
int Pop3();
void Top();
void Show();
int menu();
};
//***************************************
stack::stack()
{
sp1=-1;
sp2=-1;
sp3=-1;
};
//***************************************
int stack::IsEmpty1(){
return sp1==-1;
}
//***************************************
int stack::IsEmpty2(){
return sp2==-1;
}
//***************************************
int stack::IsEmpty3(){
return sp3==-1;
}
//***************************************

int stack::IsFull1()
{
return sp1==Max-1;
}
//***************************************
void stack::Push1()
{
if(IsFull1())
cout<<"stack is full"<<"\n""\n";
else
{
int x;
cout<<"Enter your number"<<endl;
cin>>x;
sp1++;
a[sp1]=x;
}
}
//***************************************
int stack::Pop1()
{
if(IsEmpty1())
cout<<"stack is empty"<<"\n""\n";
else
{
int x=a[sp1];
sp1--;
return x;
}
}
//***************************************
int stack::IsFull3()
{
return sp3==Max-1;
}
//***************************************
int stack::IsFull2()
{
return sp2==Max-1;
}
//
void stack::Push2()
{
if(IsFull2())
cout<<"stack is full"<<"\n""\n";
else
{
int x;
cout<<"Enter your number"<<endl;
cin>>x;
sp2++;
b[sp2]=x;
}
}
//***************************************
int stack::Pop2()
{
if(IsEmpty2())
cout<<"stack is empty"<<"\n""\n";
else
{
int x=b[sp2];
sp2--;
return x;
}
}
//***************************************
void stack::Push3()
{
if(IsFull3())
cout<<"stack is full"<<"\n""\n";
else
{
int x;
cout<<"Enter your number"<<endl;
cin>>x;
sp3++;
c[sp3]=x;
}
}
//***************************************
int stack::Pop3()
{
if(IsEmpty3())
cout<<"stack is empty"<<"\n""\n";
else
{
int x=c[sp3];
sp3--;
return x;
}
}
//***************************************
void stack::Top()
{
cout<<"the top of first stack"<<a[sp1]<<endl;
cout<<"the top of second stack"<<b[sp2]<<endl;
cout<<"the top of third stack"<<c[sp3]<<endl;
}
//***************************************
void stack::Show()
{
cout<<"The members of the first stack are:"<<endl;
for(int i=0;i<=sp1;i++)
cout<<a[i]<<endl;
cout<<"The members of the second stack are:"<<endl;
for(int j=0;j<=sp2;j++)
cout<<b[j]<<endl;
cout<<"The members of the third stack are:"<<endl;
for(int k=0;k<=sp3;k++)
cout<<c[k]<<endl;
}
//***************************************

int stack::menu(){
int x;

cout<<"1.Add Item"<<endl;
cout<<"2.Delete Item"<<endl;
cout<<"3.Display Top"<<endl;
cout<<"4.Show stack"<<endl;
cout<<"5.Exit"<<endl;
cout<<"What do you want us to do?"<<endl;
cin>>x;
return x;
}
////***************************************
int main()
{
stack st;

while(1)
{
switch(st.menu())
{
case 1:
cout<<"first stack:"<<endl;
st.Push1();
cout<<"second stack:"<<endl;
st.Push2();
cout<<"third stack:"<<endl;
st.Push3();
break;
case 2:
cout<<"first stack:"<<endl;
st.Pop1();
cout<<"second stack:"<<endl;
st.Pop2();
cout<<"third stack:"<<endl;
st.Pop3();
break;
case 3:
st.Top();
break;
case 4:
st.Show();
break;
case 5:
return 0;
default:
cout<<"incorrect"<<endl;
}
}
return 0;
}

UfnCod3r
یک شنبه 12 آبان 1392, 18:23 عصر
خب شما چرا اینوری می کنی ی کلاس پشته بساز و سه تا نمونه ازش بساز نه اینکه س تا تابع جدا براش بزاری
=))

nazi73
یک شنبه 12 آبان 1392, 18:27 عصر
آخه من تازه کارم :افسرده: برا همین اینجوری شده :ناراحت:

مثلا من می تونم سه تا شی از کلاس تعریف کنم مثل:

stack s1,s2,s3

بعد مثلا بنویسم s1.push و...
ولی آخه اینطوری قسمت top و show مقادیر اشتباه رو نشون میدن...

از دوستانی که برنامه نویسیشون خوبه میشه این کد من رو یه قسمتشو ویرایش کنند تا من متوجه بشم و بقیشم بنویسم؟

returnx
یک شنبه 12 آبان 1392, 20:40 عصر
اساسا شما کلاستون را اشتباه پیاده کردید ، شما نباید تو کلاستون به این فکر کنید که قراره چند تا از این کلاس شی ساخته بشه ، بلکه شما یک الگو ای از یک شی می سازید بعد n شی از این الگو نمونه برداری می کنید براتون یک مثال می زنم تا سر درگم نشید :
ببنید الان من اینجا یک کلاس از نوع stack ساختم (البته خیلی ساده ):
فایل سرآیند :
classstack { public: stack(); voidpush(int); intpop(); private: inti_list[100]; inttop;
};

فایل cpp برای پیاده سازی :

#include"stack.h" #include<iostream>
stack::stack() { top=0;
}

voidstack::push(intitem) {
i_list[top]=item; top++;
}
intstack::pop() {
top--; inttemp=i_list[top]; returntemp;
}

و این هم نحوه استفاده (کد main) :


intmain(intargc,char*argv[]) {
stackstack1; stackstack2; stack1.push(25); stack1.push(11);
stack2.push(31); stack2.push(4);
std::cout<<"fromstack1:"<<stack1.pop()<<"\n"; std::cout<<"fromstack1:"<<stack1.pop()<<"\n";
std::cout<<"fromstack2:"<<stack2.pop()<<"\n"; std::cout<<"fromstack2:"<<stack2.pop()<<"\n"; returna.exec(); }
شما می تونید برای استفاده از کلاس stack چندین نمونه با نام های متفاوت بسازید یا ، آرایه از این کلاس....