Cod sursa(job #1636293)

Utilizator arhivamanArhiva Man arhivaman Data 7 martie 2016 01:50:14
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.13 kb
#include <fstream>
#include <string.h>
#define nMax 100005
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
int ok, nr, number[nMax], nrnb, signs[nMax], nrsgn, a, b, m, pr[300];
char S[nMax], ch;
void read()
{
    fin>>S+1;
    m=strlen(S+1);
}
int calcul(int a, int b, char ch)
{
    switch(ch)
    {
        case '+':return a+b;break;
        case '-':return a-b;break;
        case '*':return a*b;break;
        case '/':return a/b;break;
    }
}
void solve()
{
    pr['(']=pr[')']=0;
    pr['-']=pr['+']=1;
    pr['*']=pr['/']=2;
    for(int i=1;i<=m;i++)
    {
        if(S[i]>='0'&&S[i]<='9')
        {
            ok=1;
            nr=nr*10+S[i]-'0';
        }
        else
        {
            if(ok==1)
            {
                number[++nrnb]=nr;
                ok=0;
                nr=0;
            }
            if(S[i]=='(')
            {
                signs[++nrsgn]=S[i];
            }
            else
            {
                if(S[i]==')')
                {
                    while(signs[nrsgn]!='(')
                    {
                        ch=signs[nrsgn--];
                        b=number[nrnb--];
                        a=number[nrnb];
                        number[nrnb]=calcul(a, b, ch);
                    }
                    nrsgn--;
                }
                else
                {
                    while(pr[signs[nrsgn]]>=pr[S[i]])
                    {
                        ch=signs[nrsgn--];
                        b=number[nrnb--];
                        a=number[nrnb];
                        number[nrnb]=calcul(a, b, ch);
                    }
                    signs[++nrsgn]=S[i];
                }
            }
        }
    }
    if(ok==1)
    {
        number[++nrnb]=nr;
        ok=0;
        nr=0;
    }
    while(nrsgn>0)
    {
        ch=signs[nrsgn--];
        b=number[nrnb--];
        a=number[nrnb];
        number[nrnb]=calcul(a, b, ch);
    }
}
void write()
{
    fout<<number[1];
}
int main()
{
    read();
    solve();
    write();
    return 0;
}