Cod sursa(job #874776)

Utilizator theo.stoicanTheodor Stoican theo.stoican Data 9 februarie 2013 12:12:25
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include<fstream>
#include<cstring>
using namespace std;
char s[100002];
int n;
void calibrare(int &p, int &q)
{
    int ok,c,i;
      do
        {
            ok=1;
            if(s[p]=='(')
            {
                c=1;
                i=p;
                while(c!=0)
                {
                    i++;
                    if(s[i]=='(') c++;
                    else if(s[i]==')') c--;
                }
                if(i==q)
                {
                    p++;q--;ok=0;
                }
            }
        }
        while(!ok);
}
int caut_ul_op(int p, int q)
{
    int c,ii=-1,i;
    c=0;
    for(i=q;i>=p;--i)
    {
        if(s[i]=='(') c++;
        if(s[i]==')') c--;
        if (c==0)
        {
            if(s[i]=='+' || s[i]=='-') return i;
            if((s[i]=='/' || s[i]=='*') && ii==-1) ii=i;
        }
    }
   return ii;
}
int nr(int p,int q)
{
    int i,x;
    x=0;
    for(i=p;i<=q;i++)
        x=x*10+s[i]-'0';
    return x;
}
int expresie(int p, int q)
{
    int k,v1,v2,v;
    calibrare(p,q);
    k=caut_ul_op(p,q);
    if(k==-1) return nr(p,q);
    v1=expresie(p,k-1);
    v2=expresie(k+1,q);
    v=v1+v2;
    if(s[k]=='-') v=v1-v2;
    if(s[k]=='*') v=v1*v2;
    if(s[k]=='/') v=v1/v2;
    return v;
}
int main()
{
    ifstream fin("evaluare.in");
    ofstream fout("evaluare.out");
    fin.get(s,100002,'\n');
    n=strlen(s);
    fout<<expresie(0,n-1);
    fout.close();
    return 0;
}