Cod sursa(job #145966)

Utilizator moga_florianFlorian MOGA moga_florian Data 29 februarie 2008 19:52:24
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include<fstream>
using namespace std;

char s[100005];
int nr[100005];

int grad(char ch){
    if(ch == '+' || ch=='-')
        return 1;
    return 2;
}

int eval(int li, int lf){

    int par = 0, poz = -1, minim = 3;
    for(int i=lf;i>=li;i--)
        if(s[i] == '(')
            par--;
        else
            if(s[i] == ')')
                par++;
            else
                if('0' <= s[i] && s[i] <= '9');
                else
                    if(par == 0 && grad(s[i]) < minim){
                        minim = grad(s[i]);
                        poz = i;
                        if(minim == 1)
                            break;
                    }

    if(poz == -1){
        if(s[li] == '(')
            return eval(li+1,lf-1);
        else
            return nr[li];
    }

    if(s[poz] == '-')
        return eval(li,poz-1) - eval(poz+1,lf);
    else
        if(s[poz] == '+')
            return eval(li,poz-1) + eval(poz+1,lf);
        else
            if(s[poz] == '*')
                return eval(li,poz-1) * eval(poz+1,lf);
    return eval(li,poz-1) / eval(poz+1,lf);

}

int main(){

    ifstream fin("evaluare.in");
    ofstream fout("evaluare.out");
    
    fin>>s;
    int k = -1;
    for(int i=0;s[i];i++)
        if('0' <= s[i] && s[i] <= '9'){
            int j = i;
            k++;
            nr[k] = 0;
            
            while(s[j] && '0' <= s[j] && s[j] <= '9'){
                nr[k] = nr[k] * 10 + s[j] - '0';
                j++;
            }
            
            i=j-1;
            s[k] = '1';
        }
        else
            s[++k] = s[i];

    s[k+1]= 0;
    
    fout<<eval(0,strlen(s)-1)<<"\n";
    
    fin.close();
    fout.close();
    return 0;

}