Cod sursa(job #1745018)

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

using namespace std;


int lpol;
char expr[NMax], pol[NMax];
stack<char> stk;

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

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;
}

stack<int> nums;
int solvePol()
{
    char *s;
    s = strtok(pol, " ");
    while (s != NULL)
    {
        if(!strchr("+-*/", s[0]))
            nums.push(toNum(s));
        else
        {
            int v1, v2, r;
            v1 = nums.top(); nums.pop(); 
            v2 = nums.top(); nums.pop(); 

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

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;
}