Cod sursa(job #2263938)

Utilizator InfoFabianaFabiana Maria InfoFabiana Data 19 octombrie 2018 16:54:25
Problema Evaluarea unei expresii Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.04 kb
#include <cstdio>
#include <cstring>
#include <cctype>

using namespace std;

const int NMAX = 100000;

char op[NMAX / 2],  s[NMAX + 5];
int polo[NMAX + 5];
 int pr(char ch)
    {
        switch(ch)
        {
            case '+':return 1;
            case '-':return 1;
            case '*':return 2;
            case '/': return 2;
            default: return 0;
        }
    }

int main()
{
    int n, toppolo = 0, i, topop = 0, num;
    freopen ("evaluare.in", "r", stdin);
    freopen ("evaluare.out", "w", stdout);
    scanf("%s", s);
    n = strlen(s);
    i = 0;
    while (i < n)
    {
        num  = 0;
            if (isdigit (s[i]))
            {
                num = num * 10 + s[i] - '0';
                i++;
                while (i < n && isdigit (s[i]))
                {
                     num = num * 10 + s[i] - '0';
                     i++;
                }
                polo[++toppolo] = num;
                i--;
            }
            else if (s[i] == '(')
            {
                op[++topop] = s[i];
            }
            else if (s[i] == ')')
            {
                while ((topop > 0) && op[topop] != '(')
                {
                    switch (op[topop])
                    {
                        case '+': polo[toppolo - 1] += polo[toppolo]; break;
                        case '-': polo[toppolo - 1] -= polo[toppolo]; break;
                        case '*': polo[toppolo - 1] *= polo[toppolo]; break;
                        case '/': polo[toppolo - 1] /= polo[toppolo]; break;
                    }
                    topop--;
                    toppolo--;

                }
                topop--;
            }
            else if (topop == 0 || op[topop] == '(' || (pr(s[i]) > pr(op[topop])))
            {
                op[++topop] = s[i];
            }
            else
            {
                while (topop > 0 && pr(s[i]) <= op[topop])
                {
                    switch (op[topop])
                    {
                        case '+': polo[toppolo - 1] += polo[toppolo]; break;
                        case '-': polo[toppolo - 1] -= polo[toppolo]; break;
                        case '*': polo[toppolo - 1] *= polo[toppolo]; break;
                        case '/': polo[toppolo - 1] /= polo[toppolo]; break;
                    }
                    topop--;
                    toppolo--;
                }
                op[++topop] = s[i];
             }
            i++;
    }
    while (topop > 0)
    {
        switch (op[topop])
                    {
                        case '+': polo[toppolo - 1] += polo[toppolo]; break;
                        case '-': polo[toppolo - 1] -= polo[toppolo]; break;
                        case '*': polo[toppolo - 1] *= polo[toppolo]; break;
                        case '/': polo[toppolo - 1] /= polo[toppolo]; break;
                    }
                    topop--;
                    toppolo--;
    }
    printf("%d", polo[1]);
    return 0;
}