Cod sursa(job #873683)

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

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

void empty_stack (char x)
{
    int y=pr(x);
    if (!y)
    {
        do
        {
            p[++j]=s[k];
            k--;
        } while (y<pr(s[k]));
        k--;
    }
    else
    {
        do
        {
            p[++j]=s[k];
            k--;
        } while (y<=pr(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') {do {p[++j]=e[i];i++;} while(e[i]>='0'&&e[i]<='9');i--;p[++j]=' ';}
        else if (e[i]=='('||pr(e[i])>pr(s[k])) s[++k]=e[i];
        else empty_stack(e[i]);
    }
    empty_stack (')');
    p[++j]='\0';
    l=strlen(p);
    int nr=0; j=0;
    for (i=0;i<l;i++)
    {
        if (p[i]>='0'&&p[i]<='9') {nr=0; do {nr=nr*10+p[i]-48; i++;}while(p[i]!=' '); v[++j]=nr;}
        else operate (p[i]);
    }
    fout<<v[1];
}