Cod sursa(job #1570213)

Utilizator tudor_bonifateTudor Bonifate tudor_bonifate Data 16 ianuarie 2016 11:44:23
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <cstdio>
#include <cstring>
#include <cctype>
#include <stack>
using namespace std;
int val[201],i,j,n,nr2,nr1,nr;
char s[200010],semn[200010],post[200010];
stack <int> Stiva;
int valoare(int a, int b, char c)
{
    if (c=='+') return a+b;
    if (c=='-') return a-b;
    if (c=='*') return a*b;
    if (c=='/') return a/b;
}
int main()
{
    freopen("evaluare.in","r",stdin);
    freopen("evaluare.out","w",stdout);
    gets(s+1);
    n=strlen(s+1)+1;
    s[0]='(';
    s[n]=')';
    val[')']=1;
    val['+']=val['-']=2;
    val['*']=val['/']=3;
    val[')']=4;
    nr=nr1=0;
    for (i=1; i<=n; i++)
    {
        if (s[i]=='(') semn[++nr]='(';
        else
        {
            if (isdigit(s[i]))
            {
                while (isdigit (s[i]))
                {
                    post[++nr1] = s[i];
                    i++;
                }
                post[++nr1] = ',';
                i--;
            }
            else
            {
                for (j=nr; j!=0 && semn[j]!='(' && val[s[i]]<=val[semn[j]]; j--)
                post[++nr1]=semn[j];
                if (s[i]!=')') semn[nr = j + 1] = s[i];
                else nr=j-1;
            }
        }
    }
    for (i=1; i<=nr1; i++)
    {
        if (isdigit(post[i]))
        {
            nr2=0;
            while (isdigit(post[i])) nr2=nr2*10+post[i++] -'0';
            Stiva.push(nr2);
        }
        else
        {
            nr2=Stiva.top();
            Stiva.pop();
            Stiva.top()=valoare(Stiva.top(),nr2,post[i]);
        }
    }
    printf("%d\n", Stiva.top());
    return 0;
}