Cod sursa(job #872812)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 6 februarie 2013 16:55:06
Problema Evaluarea unei expresii Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <fstream>
#include <string.h>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
char e[100005],s[100005],p[100005];
int v[100005],i,j=-1,k;

int pr(char x)
{
    if (x=='('||x==')') return 0;
    if (x=='-'||x=='+') return 1;
    if (x=='*'||x=='/') return 2;
}

void empty_stack (char x)
{
    int y=pr(x);
    while (y<pr(s[k])&&s[k]!='(')
    {
       p[++j]=s[k];
       k--;
    }
    if (y==pr(s[k]))
        {if (x==')') k--;}
    else{ if (s[k]=='(') s[++k]=x; else{ p[++j]=s[k]; s[k]=x;}}
}

void operate (char x)
{
    int a;
    switch (x)
    {
        case '+':a=v[j]+v[j-1];break;
        case '-':a=v[j-1]-v[j];break;
        case '*':a=v[j]*v[j-1];break;
        case '/':a=v[j-1]/v[j];break;
    }
    v[--j]=a;
}

int main()
{
    s[0]='(';
    fin>>e;
    int l=strlen(e);
    for (i=0;i<l;i++)
    {
        if (e[i]>='0'&&e[i]<='9') {p[++j]=e[i];continue;}
        else p[++j]=' ';
        if (pr(e[i])>pr(s[k])) s[++k]=e[i];
        else {if (e[i]!='(') empty_stack(e[i]); else s[++k]=e[i];}
    }
    empty_stack (')');
    p[++j]='\0';
    l=strlen(p);
    int nr=0; j=0; bool ok=0;
    for (i=0;i<l;i++)
    {
        if (p[i]>='0'&&p[i]<='9') {nr=nr*10+(p[i]-48);ok=1; continue;}
        else
        {
             if (ok)
            {v[++j]=nr; nr=0; ok=0;}
             if (p[i]==' ') continue;
        }
        operate (p[i]);
    }
    fout<<v[1];
}