Cod sursa(job #1713643)

Utilizator roberto2016Neamtu Ionut-Roberto roberto2016 Data 6 iunie 2016 05:25:10
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 6.1 kb
#include <iostream>
#include <string.h>
#include <cstdio>

using namespace std;
struct Node
{
    float numar;
    Node *next;
};

Node *head = NULL;

void adauga(float x)
{
    Node *temp = new Node;
    temp->numar = x;
    temp->next = head;
    head = temp;
}

float elimina()
{
    Node *temp = head;
    head = head->next;
    return temp->numar;
}

int esteGoala()
{
    if(head==NULL)
        return 1;
    return 0;
}
string InfixToPostfix(string s)
{
    string s1;
    for(unsigned int i=0;i<=s.length()-1;i++)
    {
        switch (s.at(i))
        {
        case '(':
            adauga('(');
            break;
        case ')':
            while(head->numar!='('){
                char x;
                x=elimina();
                switch (x)
                {
                case '+':
                    s1=s1+' ';
                    s1=s1+'+';
                    break;
                case '-':
                    s1=s1+' ';
                    s1=s1+'-';
                    break;
                case '*':
                    s1=s1+' ';
                    s1=s1+'*';
                    break;
                case '/':
                    s1=s1+' ';
                    s1=s1+'/';
                    break;
                }
                }
            elimina();
            break;

        case '+':
           while(!esteGoala()&&(head->numar=='*'||head->numar=='/'||head->numar=='-'||head->numar=='+'))
           {
               if(head->numar=='*')
               {
                   s1=s1+' ';
                   s1=s1+'*';
                   elimina();
               }
               else if(head->numar=='/')
               {
                   s1=s1+' ';
                   s1=s1+'/';
                   elimina();
               }
               else if(head->numar=='-')
               {
                   s1=s1+' ';
                   s1=s1+'-';
                   elimina();
               }
               else if(head->numar=='+')
               {
                   s1=s1+' ';
                   s1=s1+'+';
                   elimina();
               }
           }
           s1=s1+' ';
           adauga('+');
           break;

        case '-':
           while(!esteGoala()&&(head->numar=='*'||head->numar=='/'||head->numar=='-'||head->numar=='+'))
           {
               if(head->numar=='*')
               {
                   s1=s1+' ';
                   s1=s1+'*';
                   elimina();
               }
               else if(head->numar=='/')
               {
                   s1=s1+' ';
                   s1=s1+'/';
                   elimina();
               }
               else if(head->numar=='-')
               {
                   s1=s1+' ';
                   s1=s1+'-';
                   elimina();
               }
               else if(head->numar=='+')
               {
                   s1=s1+' ';
                   s1=s1+'+';
                   elimina();
               }
           }
           s1=s1+' ';
           adauga('-');
           break;

        case '/':
            while(!esteGoala()&&(head->numar=='*'||head->numar=='/'))
            {
               if(head->numar=='*')
               {
                   s1=s1+' ';
                   s1=s1+'*';
                   elimina();
               }
               else if(head->numar=='/')
               {
                   s1=s1+' ';
                   s1=s1+'/';
                   elimina();
               }
            }
            s1=s1+' ';
            adauga('/');
            break;
        case '*':
            while(!esteGoala()&&(head->numar=='*'||head->numar=='/'))
            {
               if(head->numar=='*')
               {
                   s1=s1+' ';
                   s1=s1+'*';
                   elimina();
               }
               else if(head->numar=='/')
               {
                   s1=s1+' ';
                   s1=s1+'/';
                   elimina();
               }
            }
            s1=s1+' ';
            adauga('*');
            break;


        default:
            s1=s1+s.at(i);
            break;
        }
    }

    while(!esteGoala())
    {
        char x;
        x=elimina();
        switch (x)
        {
        case '+':
            s1=s1+' ';
            s1=s1+'+';
            break;
        case '-':
            s1=s1+' ';
            s1=s1+'-';
            break;
        case '*':
            s1=s1+' ';
            s1=s1+'*';
            break;
        case '/':
            s1=s1+' ';
            s1=s1+'/';
            break;
        }
    }

    return s1;
}

void evalPostfix(string S)
{
    float m,n,res,x=0;
    for(unsigned int i=0;i<=S.length()-1;i++)
    {
        switch (S.at(i))
        {
            case '+':
            n = elimina();
            m = elimina();
            res = m+n;
            adauga(res);
            break;
        case '-':
            n = elimina();
            m = elimina();
            res = m-n;
            adauga(res);
            break;
        case '*':
            n = elimina();
            m = elimina();
            res = m*n;
            adauga(res);
            break;
        case '/':
            n = elimina();
            m = elimina();
            res = m/n;
            adauga(res);
            break;
        case ' ':
            break;

        default:
            x = x * 10 + (S.at(i)-'0');
            if(i<S.length()-1)
            if(S.at(i+1)<'0'||S.at(i+1)>'9')
            {
                adauga(x);
                x=0;
            }
            break;
        }
    }
}
int main()
{
    freopen("evaluare.in","r",stdin);
    freopen("evaluare.out","w",stdout);
    string exp1,exp2;
    cin>>exp1;
    exp2=InfixToPostfix(exp1);
    cout<<"Forma postfixa este: ";
    for(unsigned int i=0;i<=exp2.length()-1;i++)
        cout<<exp2.at(i);
    evalPostfix(exp2);
    cout<<endl;
    cout<<"Rezultatul expresiei este: "<<elimina();
    return 0;
}