Cod sursa(job #1251718)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 29 octombrie 2014 20:24:13
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.15 kb
#include <fstream>
#include <cstring>
#include <stack>

#define Smax 100100
#define Cmax (1 << 8)

using namespace std;

stack <char> Stack;
int N, M, Result, Integers[Smax], V[Smax], Priority[Cmax];
char A[Smax], polishForm[Smax];

void move() {

    polishForm[++M] = Stack.top();
    Stack.pop();

}
int addInteger(int index) {

    for(++N ;'0' <= A[index] && A[index] <= '9'; index++)
        Integers[N] = 10 * Integers[N] + A[index] - '0';

    return (index - 1);

}
void Evaluate() {

    int i, Top;

    N = 1;
    Top = 0;

    for(i = 1; i <= M; i++)
        switch(polishForm[i]) {

            case '@':
                V[++Top] = Integers[N++];
                break;

            case '+':
                V[Top - 1] = V[Top - 1] + V[Top--];
                break;

            case '-':
                V[Top - 1] = V[Top - 1] - V[Top--];
                break;

            case '*':
                V[Top - 1] = V[Top - 1] * V[Top--];
                break;

            case '/':
                V[Top - 1] = V[Top - 1] / V[Top--];
                break;


            }

    Result = V[1];

}
void Transform() {

    int i;

    Priority['+'] = Priority['-'] = 1;
    Priority['*'] = Priority['/'] = 2;

    for(i = 1; A[i]; i++) {

        if(isdigit(A[i])) {
            i = addInteger(i);
            polishForm[++M] = '@';
            }
        else
        if(A[i] == '(')
            Stack.push('(');
        else
        if(A[i] == ')') {

            while(Stack.top() != '(')
                move();

            Stack.pop();

            }
        else {

            while(!Stack.empty() && Priority[A[i]] <= Priority[Stack.top()])
                  move();

            Stack.push(A[i]);

            }

        }

    while(!Stack.empty())
        move();

}
void Read() {

    ifstream in("evaluare.in");
    in.getline(A + 1, Smax);
    in.close();

}
void Write() {

    ofstream out("evaluare.out");
    out << Result << '\n';
    out.close();

}
int main() {

    Read();
    Transform();
    Evaluate();
    Write();

    return 0;
}