X
تبلیغات
تمرینات درس ساختمان داده ها در c++ - Infix 2 Postfix & calculate it

تمرینات درس ساختمان داده ها در c++

Infix 2 Postfix & calculate it

//tamrin tahvili....
#include (iostream.h)
#include (stdlib.h)
//===Start of class/stack/=======================
//2 ta class baraye stack darim yeki baraye dade haye "char" va yeki baraye dade haye "int"
#define MAX 30
class stack
{
    private:
        char s[MAX];
        int top;
    public:
    stack()
    {
        top=-1;
    }
    int push(char);
    char pop();
    void show();
};
int stack::push(char x)
{
    if( top >= (MAX-1) )
        return 0;
    top++;
    s[top]=x;
    return 1;
}
char stack::pop()
{
    if(top==-1)
        return '\0';
    char y=s[top];
    top--;
    return y;
}
void stack::show()
{
for(int j=0;j
    cout<
}

//classe stack maksoose dade "int"

class int_stack
{
    private:
        int s[MAX];
        int top;
    public:
    int_stack()
    {
        for(int i=0;i
            s[i]=0;
        top=-1;
    }
    int push(int);
    int pop();
};
int int_stack::push(int x)
{
    if( top >= (MAX-1) )
        return 0;
    top++;
    //cout<<"push"<<<" top="<<
    s[top]=x;
    return 1;
}
int int_stack::pop()
{
    if(top==-1)
        return -1;
    int y=s[top];
    top--;
    //cout<<"pop"<<<" top="<<
    return y;
}
//======End of class/stack/===================================
//======Start of class/term/==================================
class term
{
    private:
        char postfix[MAX*2];
        char var[MAX];
        int val[MAX];
        int front;
        int p;
        int specify_type(char);
        void preference(stack &stk,char chr);
    public:
        term()
        {
            postfix[0]='\0';
            front=0;
            p=0;
        }
        void set();//daryafte meghdare har moteghayer az karbar
        void postfix_add(char);//jomalate postfix ra be araye "postfix[MAX*2]" ezafe mikonad
        void postfix_show(char []);//yek ebarat ra be postfix tabdil va an ra namayesh midahad
        int front_return();
        int postfix_compute();//mohasebe hasele yek ebarate postfix
        int add(char);//ezafe kardane yek moteghayere jadid be list,ta badan meghdare an ra az karbar beporsim !!!!
        int exp(int,int);//be tavan resandane yek adad
};
void term::set()
{
    for(int i=0;i
    {
        cout<<'\n'<<<" = ";
        cin>>val[i];
    }
}
int term::front_return()
{
    return front;
}
int term::add(char c)
{
    for(int i=0;i
    {
        if(var[i]==c)//agar moteghayer vojod dasht digar ezafe nemishavad
            return -1;
    }
    var[front]=c;//moteghayere jadid ra be list ezafe mikonim
    front++;
    return front;
}
void term::postfix_add(char c)
{
    postfix[p]=c;
    p++;
    postfix[p]='\0';
}
void term::postfix_show(char t[])
{
    char z;
    stack q1;
    for(int i=0 ; t[i] != '\0' ; i++)
    {
        z=t[i];
        switch ( specify_type(z) )
        {
            case 2:
                postfix_add(z);
                add(z);
                break;
            case 1:
                postfix_add(z);
                break;
            case 0:
                preference(q1,z);
                q1.push(z);
                break;
            default:
                break;
        }

    }
    //amalgar haye baghi mande dar stack ra be ebarat ezafe mikonim
    int a=1;
    do
    {
        z=q1.pop();
        if(z == '\0')
            a=0;
        else
            postfix_add(z);
    }
    while(a==1);
    cout<

}
int term::postfix_compute()//in ghesmat kheili sadeh ast !!!!
{
    int_stack q1;
    char chr;
    int a,b;
    for(int i=0 ;postfix[i] != '\0' ;i++)
    {
        chr=postfix[i];
        switch (specify_type(chr))
        {
            case 2:
                for(int j=0 ; var[j] != '\0';j++)
                {
                    if(var[j]==chr)
                    {
                        q1.push(val[j]);
                        continue;
                    }
                }
                break;
            case 1:
                q1.push(chr-'0');
                break;
            case 0:
                 if(chr=='*')
                 {
                    a=q1.pop();
                    b=q1.pop();
                    q1.push(a*b);
                 }
                else if(chr=='/')
                {
                    a=q1.pop();
                    b=q1.pop();
                    q1.push(b/a);
                }
                else if(chr=='+')
                {
                    a=q1.pop();
                    b=q1.pop();
                    q1.push(a+b);
                }
                else if(chr=='-')
                {
                    a=q1.pop();
                    b=q1.pop();
                    q1.push(b-a);
                }
                else if(chr=='^')
                {
                    a=q1.pop();
                    b=q1.pop();
                    q1.push(exp(b,a));
                }
                break;
            default:
                break;
        }
    }
    int res=q1.pop();//pasokh haman meghdari ast ke dar stack baghi mande
    return res;
}
int term::exp(int p,int e)
{
    int s=1;
    for(int i=0;i
        s=s*p;
    return s;
}
int term::specify_type(char chr)
{
    if((chr >= 'a' && chr <= 'z') || (chr >='A' && chr <= 'Z'))
        return 2;
    else if(chr >= '0' && chr <= '9')
        return 1;
    else if(chr=='*' || chr=='/' || chr=='+' || chr=='-' || chr=='^')
        return 0;
    else
        return -1;

}
void term::preference(stack &stk,char chr)
{

    int a=1;
    char z;
    switch  (chr)
    {
    case '+':
    case '-':
        do
        {
            z=stk.pop();
            if(z=='\0')
                a=0;
            else
                postfix_add(z);
        }
        while(a==1);
        break;
    case '*':
    case '/':
        do
        {
            z=stk.pop();
            if(z=='\0')
                a=0;
            else if( z=='*' || z=='/' || z=='^')
                postfix_add(z);
            else if(z=='+' || z=='-')
            {
                stk.push(z);
                a=0;
            }
        }
        while(a==1);
        break;
    case '^':
        break;
    default:
        break;
    }

}
//======End of class/term/====================================
void main()
{
    char t1[MAX];
    term term1;
    char r='y';
    cout<<"Enter your term"<
    cin>>t1;
    term1.postfix_show(t1);//convert Infix term to Postfix term
    cout<<"\nYou have ("<<<") variable,Tell me value of each:";
    term1.set();//get value of each variable
    cout<<"Result of your term is = "<
    cout<<"\nFinish !\nEnter any things to exit>";
    cin>>r;
}

+ نوشته شده در  چهارشنبه بیستم آذر 1387ساعت 21:53  توسط leal  |