Cod sursa(job #673037)

Utilizator SchumiDumitru Andrei Georgian Schumi Data 3 februarie 2012 18:56:08
Problema Evaluarea unei expresii Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <cstdio>
#include <string>
#include <iostream>
using namespace std;

int semne[100000], nr[100000], vfn, vfs;
string x;

inline int prioritate(char a)
{
    if(a == '*' || a == '/')
        return 1;

    return 0;
}

inline void operatie(int &a, int &b)
{
    if(semne[a] == '*') {
        nr[b - 1] = nr[b - 1] * nr[b];
    }
    else if(semne[a] == '/') {
        nr[b - 1] = nr[b - 1] / nr[b];
    }
    else if(semne[a] == '-') {
        nr[b - 1] = nr[b - 1] - nr[b];
    }
    else if(semne[a] == '+') {
        nr[b - 1] = nr[b - 1] + nr[b];
    }
    nr[b] = 0;
    --b;
    --a;
}


int main()
{
    int i;
    freopen ("evaluare.in", "r", stdin);
    freopen ("evaluare.out", "w", stdout);
    cin >> x;
    for(i = 0; i < x.size(); ++i) {
        if(x[i] >= '0' && x[i] <= '9') {
            ++vfn;
            while(x[i] >= '0') {
                nr[vfn] = nr[vfn] * 10 + x[i] - '0';
                ++i;
            }
            --i;
           // cerr << nr[vfn] << ' ';
        }
        else if(x[i] == '(')
            semne[++vfs] = '(';
        else if(x[i] == '+' || x[i] == '-' || x[i] == '*' || x[i] == '/') {
            while(prioritate(semne[vfs]) > prioritate(x[i]) && vfs > 0 && vfn > 1 && semne[vfs] != '(')
                operatie(vfs, vfn);
            semne[++vfs] = x[i];
        }
        else
            while(semne[vfs] != '(' && vfs > 0 && vfn > 1) {
                operatie(vfs, vfn);
                --vfs;
            }
    }
    while(vfs > 0 && vfn > 1)
        operatie(vfs, vfn);
    cerr << vfn;
    printf("%d", nr[vfn]);
    return 0;
}