Cod sursa(job #844121)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 28 decembrie 2012 20:41:07
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.43 kb
#include<stdio.h>
#include<string.h>

using namespace std;

#define MAXL 100005

long long int st[ MAXL ];
int op[ MAXL ];
char S[ MAXL ];

int main()
{
    FILE *f, *g;

    f = fopen("evaluare.in", "r");
    g = fopen("evaluare.out", "w");

    fgets(S, 1000003, f);

    int len = strlen(S) - 1;
    if(S[len] == '\n')
        --len;
    int top = 0;

    for(int i = 0; i <= len; ++i)
    {

        if(S[i] == '(')
        {
            ++top, st[top] = -2000000000;

            if(S[i-1] == '-')
                op[top] = 2;
            else if(S[i-1] == '*')
                op[top] = 3;
            else if(S[i-1] == '/')
                op[top] = 4;
            else op[top] = 1;
        }
        else if(S[i] >= '0' && S[i] <= '9')
        {
            int aux = 0, sign = 1, ii = i;
            if(S[i-1] == '-')
                sign = -1;
            while(S[i] >= '0' && S[i] <= '9')
                aux = aux * 10 + S[i] - '0', ++i;
            --i;
            ++top, st[top] = aux * sign;
            if(sign == -1)
            {
                op[top] = 1;
            }
            else if(S[ii-1] == '*')
                op[top] = 3;
            else if(S[ii-1] == '/')
                op[top] = 4;
            else op[top] = 1;
        }
        else if(S[i] == ')')
        {
            int ii = top - 1, top2, aux;

            while(st[ii] != -2000000000)
                --ii;
            top2 = ii - 1;
            aux = op[ii];
            for(int j = ii + 1; j <= top; ++j)
            {
                if(op[j] <= 2)
                    ++top2, st[top2] = st[j], op[top2] = op[j];
                else if(op[j] == 3)
                    st[top2] *= st[j];
                else st[top2] /= st[j];
            }
            op[ii] = aux;
            for(int j = ii + 1; j <= top2; ++j)
                if(op[j] == 1)
                    st[ii] += st[j];
                else st[ii] -= st[j];
            top = ii;

        }
    }

    int top2 = 0;
    for(int i = 1; i <= top; ++i)
        if(op[i] <= 2)
            ++top2, st[top2] = st[i], op[top2] = op[i];
        else if(op[i] == 3)
            st[top2] *= st[i];
        else st[top2] /= st[i];
    for(int i = 2; i <= top2; ++i)
        if(op[i] == 1)
            st[1] += st[i];
        else st[1] -= st[i];

    fprintf(g, "%d\n", st[1]);

    fclose(f);
    fclose(g);

    return 0;
}