Cod sursa(job #1091168)

Utilizator kiralalaChitoraga Dumitru kiralala Data 24 ianuarie 2014 18:03:41
Problema Evaluarea unei expresii Scor 60
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);

stack<char> op;
stack<int> num;
char sign[]="*/-+",l1[]="/*";

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

int main()
{
    char c;
    scanf(" %c",&c);
    while(c!='\n')
    {
        int n=0;
        switch(c)
        {
            case '(':
                op.push(c);
                break;
            case '*':
                if(!op.empty()&&strchr(l1,op.top()))
                {
                    Evaluate(op.top());
                    op.pop();
                }
                op.push(c);
                break;
            case '/':
                if(!op.empty()&&strchr(l1,op.top()))
                {
                    Evaluate(op.top());
                    op.pop();
                }
                op.push(c);
                break;
            case '+':
                if(!op.empty()&&strchr(sign,op.top()))
                {
                    Evaluate(op.top());
                    op.pop();
                }
                op.push(c);
                break;
            case '-':
                if(!op.empty()&&strchr(sign,op.top()))
                {
                    Evaluate(op.top());
                    op.pop();
                }
                op.push(c);
                break;
            case ')':
                while(op.top()!='(')
                {
                    Evaluate(op.top());
                    op.pop();
                }
                op.pop();
                break;
            default :
                while(c>='0'&&c<='9')
                {
                    n=n*10+(c-'0');
                    scanf("%c",&c);
                }
                num.push(n);
                break;
        }
        if(n) n=0;
        else scanf("%c",&c);
    }

    while(!op.empty())
    {
        Evaluate(op.top());
        op.pop();
    }

    printf("%d",num.top());

    return 0;
}