Cod sursa(job #1507357)

Utilizator SolcanMihaiSolcan Mihai Andrei SolcanMihai Data 21 octombrie 2015 17:07:18
Problema Evaluarea unei expresii Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 3.05 kb
#include <cstdio>
#include <cstring>
#include <stack>
#include <math.h>

using namespace std;

stack<int> numere;
stack<char> semne;
char x[100100];
char semneTemplate[4][2];

void initializare()
{
    semneTemplate[0][0] = '(';
    semneTemplate[0][1] = ')';
    semneTemplate[1][0] = '^';
    semneTemplate[1][1] = '^';
    semneTemplate[2][0] = '*';
    semneTemplate[2][1] = '/';
    semneTemplate[3][0] = '+';
    semneTemplate[3][1] = '-';
}

int compareSign(char p)
{
    for(int i = 0; i < 4; i++)
    {
        for(int j = 0; j < 2; j++)
        {
            if(p == semneTemplate[i][j])
            {
                return i;
            }
        }
    }
}

void handleSign(char p)
{
    int nr1, nr2;
    nr2 = numere.top();
    numere.pop();
    nr1 = numere.top();
    numere.pop();

    if(p == '+')
    {
        numere.push(nr1 + nr2);
    }
    else if(p == '-')
    {
        numere.push(nr1 - nr2);
    }
    else if(p == '*')
    {
        numere.push(nr1 * nr2);
    }
    else if(p == '/')
    {
        numere.push(nr1 / nr2);
    }
    else if(p == '^')
    {
        numere.push(pow(nr1, nr2));
    }
}

int evaluare()
{
    char tmp[10];
    char tmpx[10];

    int nr = 0;

    for(int i = 0; i < strlen(x); i++)
    {
        if(x[i] >= '0' && x[i] <= '9')
        {
            tmpx[0] = '\0';

            while(x[i] >= '0' && x[i] <= '9')
            {
                if(strlen(tmpx) == 0)
                {
                    tmpx[1] = '\0';
                }
                tmpx[strlen(tmpx)] = '\0';
                tmpx[strlen(tmpx) + 1] = '\0';
                tmpx[strlen(tmpx)] = x[i];
                i++;
            }

            int m;
            sscanf(tmpx, "%d", &m);

            i--;

            numere.push(m);
        }
        else
        {
            if(x[i] == '(')
            {
                semne.push('(');
                continue;
            }
            else if(x[i] == ')')
            {
                while(semne.top() != '(')
                {
                    handleSign(semne.top());
                    semne.pop();
                }

                semne.pop();
            }
            else if(!semne.empty())
            {
                if(compareSign(x[i]) >= compareSign(semne.top()) && semne.top() != '(')
                {
                    handleSign(semne.top());
                    semne.pop();
                    semne.push(x[i]);
                }
                else
                {
                    semne.push(x[i]);
                }
            }
            else
            {
                semne.push(x[i]);
            }



        }
    }

    while(!semne.empty())
    {
        handleSign(semne.top());
        semne.pop();
    }

    return numere.top();
}

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

    gets(x);
    initializare();
    printf("%d", evaluare());



    return 0;
}