Cod sursa(job #1091395)

Utilizator kiralalaChitoraga Dumitru kiralala Data 25 ianuarie 2014 17:37:54
Problema Evaluarea unei expresii Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.34 kb
#include <fstream>
#include <cstring>
#include <stack>
#define NMAX 10005

using namespace std;
//forma poloneza
FILE* f=freopen("evaluare.in","r",stdin);
FILE* o=freopen("evaluare.out","w",stdout);

char exp[100005];
char pol[100005],ind;
stack<char> op;
stack<int> num;

char sign[]="*/-+",l1[]="/*";
int res;

void ToPolish()
{
    int l=strlen(exp);
    for(int i=0;i<l;++i)
    {
        char c=exp[i];
        switch(c)
        {
            case'+':case'-':
            pol[ind++]=' ';
                if(!op.empty()&&strchr(sign,op.top()))
                {
                    pol[ind]=op.top();
                    pol[ind+1]=' ';
                    ind+=2;
                    op.pop();
                }
            op.push(c);
            break;
            case'*':case'/':
            pol[ind++]=' ';
                if(!op.empty()&&strchr(l1,op.top()))
                {
                    pol[ind]=op.top();
                    pol[ind+1]=' ';
                    ind+=2;
                    op.pop();
                }
            op.push(c);
            break;
            case'(':
                op.push(c);
            break;
            case')':
                while(op.top()!='(')
                {
                    pol[ind+1]=op.top();
                    pol[ind]=' ';
                    ind+=2;
                    op.pop();
                }
                op.pop();
            break;
            default:
                pol[ind++]=c;
            break;
        }
    }
    while(!op.empty()) { pol[ind+1]=op.top(); pol[ind]=' '; ind+=2; op.pop(); }
}

void Operation(char c)
{
    int b=num.top(); num.pop();
    int a=num.top(); num.pop();
    switch (c)
    {
        case '+': num.push(a+b); break;
        case '-': num.push(a-b); break;
        case '*': num.push(a*b); break;
        case '/': num.push(a/b); break;
    }
}

void Number(char c[])
{
    int x=0;
    for(int i=0;i<strlen(c);++i)
        x=x*10+(c[i]-'0');
    num.push(x);
}

void Evaluate()
{
    char *p=strtok(pol," ");
    while(p)
    {
        if(strstr(sign,p))
            Operation(p[0]);
        else
            Number(p);
        p=strtok(NULL," ");
    }
}

int main()
{
    gets(exp);
    ToPolish();
    Evaluate();
    printf("%d",num.top());

    return 0;
}