Cod sursa(job #1745025)

Utilizator daymon_cDumitru Chitoraga daymon_c Data 20 august 2016 23:15:13
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.13 kb
#include <stdio.h>
#include <cstring>
#define NMax 100005

using namespace std;


int lpol;
char expr[NMax], pol[NMax];
char stk[NMax], st;

void polish(char *a, int n, char *b, int &m)
{
    for (int i=0; i<n; ++i)
    {
        switch (a[i])
        {
            case '(':
                stk[++st] = '('; break;
            case ')': 
                while (stk[st]!='(')
                {
                    b[m++]=' ', b[m++]=stk[st];
                    st--;
                }
                st--;
                break;
            case '*': case '/':  
                stk[++st] = a[i]; 
                break;
            case '+': case '-': 
                while (st && stk[st]!='(')
                {
                    b[m++]=' ', b[m++]=stk[st];
                    st--;
                }
                stk[++st] = a[i];
                break;
            default:
                b[m++]=' ';
                for(;i<n && a[i]>='0' && a[i]<='9';++i)
                    b[m++]=a[i];
                --i;
                break;
        }
    }
    while (st)
    {
        b[m++]=' ', b[m++]=stk[st];
        st--;
    }
}

int toNum(char *s)
{
    int num = 0;
    int l = strlen(s);

    for(int i=0; i<l; ++i)
    {
        num = num*10 + (s[i]-'0');
    }

    return num;
}

int nums[NMax], nm;
int solvePol()
{
    char *s;
    s = strtok(pol, " ");
    while (s != NULL)
    {
        if(!strchr("+-*/", s[0]))
            nums[++nm] = toNum(s);
        else
        {
            int v1, v2, r;
            v1 = nums[nm]; nm--; 
            v2 = nums[nm]; nm--; 

            switch(s[0])
            {
                case '*': r = v1 * v2; nums[++nm]=r; break;
                case '/': r = v2 / v1; nums[++nm]=r; break;
                case '+': r = v1 + v2; nums[++nm]=r; break;
                case '-': r = v2 - v1; nums[++nm]=r; break;
            }
        }
        s = strtok(NULL, " ");
    }
    return nums[nm];
}

int main()
{
    freopen("evaluare.in", "r", stdin);
    freopen("evaluare.out", "w", stdout);

    fgets(expr, sizeof(expr), stdin);

    polish(expr, strlen(expr), pol, lpol);

    printf("%d", solvePol());

    return 0;
}