Cod sursa(job #1974251)

Utilizator MaligMamaliga cu smantana Malig Data 27 aprilie 2017 08:41:10
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.53 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <stack>

using namespace std;
ifstream in("evaluare.in");
ofstream out("evaluare.out");

const int strMax = 1e5 + 5;

int N,nrPost;
int prio[256];
char str[strMax];

struct elem {
    int nr;
    char c;
    elem(int _nr = 0,char _c = '\0') {
        nr = _nr;
        c = _c;
    }
}post[strMax];

int getNumber(int&);

int main() {
    in>>(str+2);
    str[1] = '(';
    N = strlen(str+1);
    str[++N] = ')';

    //cout<<str+1<<'\n';

    prio['('] = prio[')'] = 1;
    prio['+'] = prio['-'] = 2;
    prio['*'] = prio['/'] = 3;

    stack<char> stiv;
    for (int i=1;i<=N;++i) {
        if (str[i] == '(') {
            stiv.push('(');
        }
        else if (str[i] == ')') {
            while (stiv.top() != '(') {
                post[++nrPost] = elem(0,stiv.top());
                stiv.pop();
            }
            stiv.pop();
        }
        else if ('0' <= str[i] && str[i] <= '9') {
            int nr = getNumber(i);
            post[++nrPost] = elem(nr);
        }
        else {
            while (prio[stiv.top()] >= prio[str[i]]) {
                post[++nrPost] = elem(0,stiv.top());
                stiv.pop();
            }
            stiv.push(str[i]);
        }
    }

    /*
    for (int i=1;i<=nrPost;++i) {
        if (post[i].c != '\0') {
            cout<<post[i].c<<' ';
        }
        else {
            cout<<post[i].nr<<' ';
        }
    }
    cout<<'\n';
    //*/

    stack<int> aux;
    for (int i=1;i<=nrPost;++i) {
        if (post[i].c == '\0') {
            aux.push(post[i].nr);
        }
        else {
            int nr1,nr2,res = 0;
            nr1 = aux.top(); aux.pop();
            nr2 = aux.top(); aux.pop();
            char op = post[i].c;
            switch (op) {
            case '+': {
                res = nr2 + nr1;
                break;
            }
            case '-': {
                res = nr2 - nr1;
                break;
            }
            case '*': {
                res = nr2 * nr1;
                break;
            }
            case '/': {
                res = nr2 / nr1;
                break;
            }
            }
            aux.push(res);
        }
    }
    out<<aux.top()<<'\n';

    in.close();out.close();
    return 0;
}

int getNumber(int& i) {
    int nr = 0;
    while ('0' <= str[i] && str[i] <= '9') {
        nr = nr*10 + (str[i]-'0');
        ++i;
    }
    --i;

    return nr;
}