Cod sursa(job #585554)

Utilizator drywaterLazar Vlad drywater Data 30 aprilie 2011 01:14:41
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.08 kb
#include <stdio.h>
#include <string.h>
using namespace std;
// + -2 - -3 * -4 / -5 ( -6
int i,k,l,nr,st[100001],post[100001];
char sir[100001];
int main(void)
{
    freopen("evaluare.in","r",stdin);
    freopen("evaluare.out","w",stdout);
    scanf("%s",sir);
    l=strlen(sir)-1;
    for (i=0;i<=l;)
    {
        nr=0;
        if (sir[i]=='-' && (i==0 || sir[i-1]=='(')) post[++post[0]]=0;
        if (sir[i]>='0' && sir[i]<='9')
        {
        while (sir[i]>='0' && sir[i]<='9' && i<=l)
        {
            nr=nr*10+sir[i]-'0';
            i++;
        }
        post[++post[0]]=nr;
        continue;
        }
        if (sir[i]==')')
        {
            while (st[k]!=-6)
            {
                post[++post[0]]=st[k];
                k--;
            }
            k--;
            i++;
            continue;
        }
        if (sir[i]=='+' || sir[i]=='-')
        {
            while (st[k]/2<=-1 && st[k]!=-6) {post[++post[0]]=st[k]; k--;}
            if (sir[i]=='+') st[++k]=-2; else st[++k]=-3;
            i++;
            continue;
        }
        if (sir[i]=='(') {st[++k]=-6; i++; continue;}
        if (sir[i]=='*' || sir[i]=='/')
        {
            while (st[k]/2==-2) {post[++post[0]]=st[k]; k--;}
            if (sir[i]=='*') st[++k]=-4; else st[++k]=-5;
            i++;
            continue;
        }
        i++;
    }
    while (k) {post[++post[0]]=st[k]; k--;}
    k=0;
    for (i=1;i<=post[0];i++)
    {
        if (post[i]>=0)
        {
            st[++k]=post[i];
            continue;
        }
        if (post[i]==-2)
        {
            st[k-1]+=st[k];
            k--;
            continue;
        }
        if (post[i]==-3)
        {
            st[k-1]-=st[k];
            k--;
            continue;
        }
        if (post[i]==-4)
        {
            st[k-1]*=st[k];
            k--;
            continue;
        }
        if (post[i]==-5)
        {
            st[k-1]/=st[k];
            k--;
            continue;
        }
    }
    printf("%d\n",st[1]);
    return 0;
}