Cod sursa(job #818908)

Utilizator a96tudorAvram Tudor a96tudor Data 18 noiembrie 2012 12:03:01
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.36 kb
#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
#include<cmath>
using namespace std;
const char op[4]={'+','-','*','/'};
int polon[100010],m,n1,n=0;
char oper[100010],s[100010];
void asezare(char x)
{
    if (x=='*' || x=='/') oper[++m]=x;
            else { if (oper[m]=='*' || oper[m]=='/')
                    {
                            while (oper[m]=='*' || oper[m]=='/')
                                {
                                    polon[n]=-oper[m];
                                    n++;
                                    m--;
                                }
                            oper[++m]=x;
                    }
                    else oper[++m]=x;
                    }
}
inline void tranzactie()
{
    while (oper[m]!='(')
    {

        polon[n]=-oper[m];
        n++;
        m--;
    }
    m--;
    return;
}
bool operatie(char x)
{
    int i;
    bool ok=false;
    for(i=0;i<4;i++)
        if (x==op[i]) ok=true;
    return ok;
}
inline void polona()
{
    int i;
    for (i=0;i<n1;i++)
    {
        if (isdigit(s[i])) polon[n]=polon[n]*10+s[i]-48;
            else {  if (isdigit(s[i-1])) n++;
                    if (s[i]=='(') oper[++m]=s[i];
                    if (operatie(s[i])) asezare(s[i]);
                    if (s[i]==')') tranzactie();
                    }
    }
}
void final()
{
    while (m>0)
    {
        if (oper[m]!='(') polon[++n]=-oper[m];
        m--;
    }
}
inline int finder()
{
    int i,j;
    for (i=0;i<=n;i++)
        if (polon[i]<0) return i;
}
inline int efectuare(int x,int y,char op)
{
    if (op=='*') return x*y;
    if (op=='/')return x/y;
    if (op=='+') return x+y;
    if (op=='-') return x-y;
}
inline void erase(int poz)
{
    int i;
    for (i=poz+2;i<=n;i++)
        polon[i-2]=polon[i];
    return ;
}
inline void evaluare()
{
    int i,poz,nr;
    while (n!=0)
    {
        poz=finder();
        nr=efectuare(polon[poz-2],polon[poz-1],abs(polon[poz]));
        erase(poz-1);
        polon[poz-2]=nr;
        n-=2;
    }
    return;
}
int main()
{
    freopen("evaluare.in","r",stdin);
    freopen("evaluare.out","w",stdout);
    gets(s);
    n1=strlen(s);
    polona();
    final();
    evaluare();
    printf("%d",polon[0]);
    fclose(stdin);
    fclose(stdout);
    return 0;
}