پشته در ++c

lighting

Member
سلام به دوستان عزیز

می خوام یه سوال درباره ساختار داده پشته با استفاده از ارایه بپرسم:
برای این که برنامه اش رو توی c++ بنویسیم باید یه فایل هدر براش تعریف کنیم یعنی مثل این :
کد:
#include "stack.h"
یا این که لازم نیست همین جوری هم می شه نوشت؟

من برای قسمت اولش یه همچین الگوریتمی نوشتم:این الگوریتم درسته؟
کد:
[LEFT]public class ArrayStack implements Stack{
public:
static final int capacity=1000;
private:
int capacity;
object s[];
int top=-1;
public Arraystack(){
this (capacity);
}
public ArrayStack (int cap){
Capacity=cap;
s=new object [capacity];
}
}[/LEFT]
 
آخرین ویرایش:

the_king

مدیرکل انجمن
اگر می خواهید با ساختار خود stack ای که در ++C بصورت استاندارد وجود داره کار کنید که دیگه کاری
با آرایه ندارید، کلاس stack یک پیاده سازی خاص خودش رو داره که ممکنه با آرایه باشه یا نباشه و برنامه نویسی
که ازش استفاده می کنه هم درگیر این ساختار داخلی نیست. حتما هم باید stack.h رو include کنید چون
stack باید تعریف بشه، اگر include اش نکنید یک عبارت تعریف نشده است که کامپایلر بهش ایراد می گیره.

کد:
#include <conio.h>
#include <iostream.h>
#include <stack.h>

int main()
{
    int i;
    stack <int> p;
    p.push(1);
    p.push(2);
    p.push(3);
    p.push(4);
    while (! p.empty())
    {
        i = p.top();
        p.pop();
        cout << i << " ";
    }
    getch();
    return 0;
}

تعریف کردن یک پشته جدید با نام p با عضو هایی از نوع داده ای int
کد:
    stack <int> p;

push کردن چند مقدار به داخل پشته p
کد:
    p.push(1);
    p.push(2);
    p.push(3);
    p.push(4);

یک حلقه که تا زمانی اجرایش تکرار می شود که پشته p خالی نشده باشد :
کد:
    while (! p.empty())
    {
.
.
.
    }

مقدار بالای پشته p را در متغیر i قرار می دهیم و سپس از پشته حذف می کنیم (pop می کنیم)
کد:
        i = p.top();
        p.pop();

مقداری که pop کرده ایم را نمایش می دهیم :
کد:
        cout << i << " ";

تاپیک منتقل گردید.
 

lighting

Member
چون من می خوام برنامه اش رو با ارایه بنویسم پس لازم به هدر جدا نیست. ممنون

اون الگوریتمی که برای نوشتن پشته با ارایه (به صورت شی گرا) نوشتم درست می شه؟؟؟
 
آخرین ویرایش:

the_king

مدیرکل انجمن
چون من می خوام برنامه اش رو با ارایه بنویسم پس لازم به هدر جدا نیست. ممنون

اون الگوریتمی که برای نوشتن پشته با ارایه (به صورت شی گرا) نوشتم درست می شه؟؟؟

کد:
#include <conio.h>
#include <iostream.h>

template <class T>
class ArrayStack
{
    private :
        int capacity, top;
        T *s;

    public :
        ArrayStack()
        {
            capacity = 1000;
            s = new T[capacity];
            top = -1;
        }

        ArrayStack(int cap)
        {
            capacity = cap;
            s = new T[capacity];
            top = -1;
        }

        void push(T v)
        {
            if (full())
                return;
            top++;
            s[top] = v;
        }

        T pop()
        {
            if (empty())
                return s[0];
            top--;
            return s[top + 1];
        }

        int full()
        {
            if (top < capacity - 1)
                return 0;
            return 1;
        }

        int empty()
        {
            if (top == -1)
                return 1;
            return 0;
        }
};

int main()
{
    int i;
    ArrayStack <int> p;
    p.push(1);
    p.push(2);
    p.push(3);
    p.push(4);
    while (! p.empty())
    {
        i = p.pop();
        cout << i << " ";
    }
    getch();
    return 0;
}
 

lighting

Member
توی این تابع بالا که برای پشته نوشتید اگه یه قسمت اضافه کنم برای تبدیل عبارت میانوندی به پسوندی این برنامه که نوشتم درسته؟

این الگوریتم برای تبدیل عبارت میانوندی به پسوندیه:

کد:
void postfix (expression s)
char t;
for (int i=0 ; s[i]!='10'; i++)    
if(s[i] is an operand)       
cout<<s[i];          
else
if (s[i]=='(')     
push(s[i]);      
else
if (s[i]==')')
for(pop (t); t!='('; pop(t))   
cout <<t;     
else 
if (Isempty()|| p(stack[top])<p(s[i]))
push (s[i]);     
else
for(pop (t); p(t)>=p(s[i]) && t!='('; pop (t))
cout<<t;    
push(t);     
push (s[i]);      
while(!Isempty())          
{
pop(t);
cout<<t;       
}
 
آخرین ویرایش:

lighting

Member
یه سوال دیگه برای این که یه عبارت ریاضی رو توی همین تابع که شامل عملیات چهارگانه و توان و پرانتز می شه از طریق یه فایل in.txt به عنوان ورودی داده شه و خروجی هم در فایل out.txt ذخیره شه باید این کار رو کرد:
یعنی این قسمت رو باید توی قسمت mian کلاس بنویسیم بعد خودمون یه عبارت ریاضی رو در نظر بگیریم بعد با استفاده از این تابع

کد:
[LEFT]ifstream f1
f1.open ("file1.txt")
if (!f1)
{
cout<<"cannot open file";
exit(0)
}[/LEFT]

که البته این تست صحت باز کردن فایل هستش ولی یه همیچین چیزی از طریق فایل به به عنوان ورودی به برنامه بدیم و در خروجی هم به
صورت یه فایل بگیریم؟؟؟؟؟؟؟
بازم خیلی خیلی ممنون از توضیحاتتون​
 
آخرین ویرایش:

the_king

مدیرکل انجمن
یه سوال دیگه برای این که یه عبارت ریاضی رو توی همین تابع که شامل عملیات چهارگانه و توان و پرانتز می شه از طریق یه فایل in.txt به عنوان ورودی داده شه و خروجی هم در فایل out.txt ذخیره شه باید این کار رو کرد:
یعنی این قسمت رو باید توی قسمت mian کلاس بنویسیم بعد خودمون یه عبارت ریاضی رو در نظر بگیریم بعد با استفاده از این تابع

کد:
[LEFT]ifstream f1
f1.open ("file1.txt")
if (!f1)
{
cout<<"cannot open file";
exit(0)
}[/LEFT]

که البته این تست صحت باز کردن فایل هستش ولی یه همیچین چیزی از طریق فایل به به عنوان ورودی به برنامه بدیم و در خروجی هم به
صورت یه فایل بگیریم؟؟؟؟؟؟؟
بازم خیلی خیلی ممنون از توضیحاتتون​

درسته ولی در فایل شما یک متن رشته ای ذخیره می کنید که ممکنه اعداد چند رقمی داشته باشه.
داخل تابع postfix شما با یک expression کار می کنید که عملوند و عملگر هاش از هم قابل تفکیک کردن اند و
هر عملوندی در یک خانه اش ذخیره شده.

شما باید ابتدا رشته ای که از فایل می خوانید را پردازش کنید، مثلا رشته "123+45" یک عبارت 6 کاراکتری است
اما expression ای که به postfix باید تحویل دهید سه تا عضو بیشتر نداره، عملوند 123، عملگر + و عملوند 45 .
شما در هنگام پیاده سازی یک روال برای تفسیر کردن رشته و تفکیک کردن عملوند و عملگر ها بنویسید تا
postfix بتونه از نتیجه اش استفاده کنه.
 

lighting

Member
خب این یعنی این که توی رشته دو متغیر جدا به عنوان عملگر و عملوند ایجاد کنیم بعد این تابع رو براش بیاریم؟؟؟؟؟
 

the_king

مدیرکل انجمن
خب این یعنی این که توی رشته دو متغیر جدا به عنوان عملگر و عملوند ایجاد کنیم بعد این تابع رو براش بیاریم؟؟؟؟؟

تنها با دو متغیر نمیشه، چون در رشته حداقل سه عبارت دارید و ترتیب شون هم مهمه و نباید به دو گروه عملگر و عملوند
مجزا تفکیک شوند، اینکار بعدا در postfix طبق روال خاصی در پشته انجام میشه. برای تفسیر کردن رشته معمولا فقط
یک آرایه ایجاد میشه. رشته رو از ابتدا به انتها بررسی می کنید، چه عملگر بود و چه عملوند در اون آرایه ثبت می کنید،
نه ترتیب شون رو تغییر می دهید و نه تفکیک خاصی می کنید. موردی که اهمیت داره اینه که اگر فرضا به
رشته 123 رسیدید باید عملوند 123 رو یکجا در یک خانه ذخیره کنید، نه 1 و 2 و 3 در سه خانه پیایی.

اون آرایه باید هم توانایی نگهداری عملگر و هم عملوند رو داشته باشه و بتوانید تشخیص بدهید که در خانه شماره فلان
عملوند قرار گرفته یا عملگر. آرایه خانه هایش یا از نوع عددی است یا رشته ای یا یک ساختار داده ای struct .

در شیوه عددی باید برای عملگر ها یک کد عددی منحصر بفرد تعریف کنید، مثلا عملگر + را با کد عددی 9999 ذخیره کنید
تا با عملوند های عددی اشتباه گرفته نشه. اما اگر از struct استفاده کنید می توانید یک فیلد کاراکتری برای عملگر
و یک فیلد عددی برای عملوند در نظر بگیرید که البته در هر خانه یکی از این فیلد ها پر میشه و دیگری خالی می مونه
چون در هر خانه یا عملوند ذخیره میشه یا عملگر، نه هر دو.
در آرایه رشته ای باید عملوند های عددی بصورت رشته ثبت شوند که پردازش شون رو پیچیده می کنه.

مثلا در این کد پاسکال برای هر عملگر یک کد عددی تعریف شده، فرضا کد عملگر + برابر با 32752 است :

تبدیلات Infix به Postfix و محاسبه نتیجه در زبان پاسکال
 

lighting

Member
خب الان برای مثال این عبارت :​
کد:
[LEFT](a*b)-c))\(d^c)+(b+c-d)*a))[/LEFT]
برو توی یک فایل به نام in.txt به عنوان ورودی به برنامه می دم(این قسمت توی main کلاس نوشته می شه)
که اینجوریه؟؟​
کد:
[LEFT]int main()
{
int a, b,c,d;
char str[80];
ifstream in ("in.txt");
if(1in)
{
cout <<"cannot open file.\n";
return 1;}
in>>a>>b>>c>>d;
in>>str;
cout<<a<<b<<c<<d<<""<<str;
in.close();
cout<<endl;
return 0;
}[/LEFT]
البته نتونستم خیلی درست بنویسمش فکر نکنم درست باشه:sad:
تازه قسمت خروجی اش هم که توی فایل out.txt هست رو نمی دونم چه جوری می شه!!!!!​
 

the_king

مدیرکل انجمن
فایل های که با ifstream و ofstream تعریف می کنید مثل cin و cout هستند.
برای نوشتن نتیجه که لابد یک عدده همانطوری که به cout می فرستید به فایل خروجی تان عدد را می فرستید.

در این تاپیک با fout همینکار انجام شده :
درخواست نوشتن یه برنامه در c++
 

lighting

Member
یعنی الان این برنامه ای که نوشتم برای اون عبارت ریاضی درسته و فقط باید خروجیش رو درست کنم؟
شرمنده ها ولی من این قسمت رو اصلا خوب متوجه نمی شم
:sad:
 
آخرین ویرایش:

the_king

مدیرکل انجمن
یعنی الان این برنامه ای که نوشتم برای اون عبارت ریاضی درسته و فقط باید خروجیش رو درست کنم؟
شرمنده ها ولی من این قسمت رو اصلا خوب متوجه نمی شم
:sad:

باید خروجی اش رو بنویسید و یک بخش که رشته ورودی رو تفسیر کنه و عملگر و عملوند ها را در آرایه قرار بده.
 

lighting

Member
یه هدر
کد:
 #include<fstream>
اول کلاس گذاشتم، بعد توی تابع main اینو نوشتم:​
کد:
[LEFT]int main()
{
char str[80];
ofstream in ("in.txt");
cin>>"((a\b)-c)+(d*e)-(a*c))^d";
ofstream out ("out.txt");
cout<<"ab\c-de*+ac*-d^";
}[/LEFT]
درسته؟؟؟
توی کامپایلر که اجراش می کنم دو تا فایل رو می سازه ولی توش خالیه؟​
 
آخرین ویرایش:

the_king

مدیرکل انجمن
یه هدر
کد:
 #include<fstream>
اول کلاس گذاشتم، بعد توی تابع main اینو نوشتم:​
کد:
[LEFT]int main()
{
char str[80];
ofstream in ("in.txt");
cin>>"((a\b)-c)+(d*e)-(a*c))^d";
ofstream out ("out.txt");
cout<<"ab\c-de*+ac*-d^";
}[/LEFT]
درسته؟؟؟
توی کامپایلر که اجراش می کنم دو تا فایل رو می سازه ولی توش خالیه؟​

دلیل اش اینه که شما چیزی در فایل ها ننوشتید.
اسم stream فایل اول تون in ئه و اسم دومی out ، بجای cin و cout باید از اسم این فایل ها استفاده کنید.
اگر با ofstream تعریف شون کنید مثل cout برای نوشتن هستند، نه برای خواندن، پس از >> استفاده کنید، نه <<
در ضمن در هنگام نوشتن کاراکتر \ در رشته های ++C و C باید از دو \\ استفاده کنید چون کاراکتر کنترلی یه
و با کاراکتر بعدی اش تفسیر میشه، مثلا t\ و n\ . اگه با یک \ بنویسیدش نتیجه کاراکتر دیگری خواهد بود.
بستن فایل قبل از خروج ار برنامه رو هم فراموش نکنید.

کد:
#include <iostream>
#include <fstream>

int main()
{
    char str[80];
    ofstream in ("in.txt");
    in << "((a\\b)-c)+(d*e)-(a*c))^d";
    in.close();
    ofstream out ("out.txt");
    out << "ab\\c-de*+ac*-d^";
    out.close();
    return 0;
}
 

جدیدترین ارسال ها

بالا