Cod sursa(job #1510488)

Utilizator SolcanMihaiSolcan Mihai Andrei SolcanMihai Data 25 octombrie 2015 08:48:26
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.15 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] = '-';
}

int compareSign(char p)
{
    if(p == '+' || p == '-') return 1;
    if(p == '*' || p == '/') return 2;
    return 0;
}

void handleSign()
{
    int nr1, nr2;
    nr2 = numere.top();
    numere.pop();
    nr1 = numere.top();
    numere.pop();
    char p = semne.top();
    semne.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);
    }
}

int evaluare()
{
    semne.push('$');
    int n = strlen(x);
    int m, px;

    for(int i = 0; i < n; i++){
        if(x[i] == '('){
            semne.push(x[i]);
        } else {
            if(x[i] == ')'){
                while(semne.top() != '('){
                    handleSign();
                }
                semne.pop();
            } else {
                px = compareSign(x[i]);
                if(px){
                    while(compareSign(semne.top()) >= px){
                        handleSign();
                    }
                    semne.push(x[i]);
                } else {
                    m = 0;
                    while(x[i] >= '0' && x[i] <= '9'){
                        m = m * 10 + (x[i] - '0');
                        i++;
                    }
                    i--;
                    numere.push(m);
                }
            }
        }
    }
    while(semne.size() > 1){
        handleSign();
    }

    return numere.top();
}

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

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



    return 0;
}