Cod sursa(job #1332933)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 2 februarie 2015 16:27:33
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.11 kb
#include <fstream>
#include <cstring>
#include <stack>
#include <queue>

#define Cmax 128
#define Smax 100100

using namespace std;

int N, Size, Result, priority[Cmax], Integer[Smax], A[Smax];
char Expression[Smax];
queue <char> polishForm;
stack <char> Stack;

void Evaluate() {

    int i, top;

    for(top = 0, N = 1; !polishForm.empty(); polishForm.pop())
        switch(polishForm.front()) {
            case '@':
                A[++top] = Integer[N++];
                break;

            case '+':
                A[top] += A[top--];
                break;

            case '-':
                A[top] -= A[top--];
                break;

            case '*':
                A[top] *= A[top--];
                break;

            case '/':
                A[top] /= A[top--];
                break;
        }

    Result = A[1];

}
void move() {
    polishForm.push(Stack.top());
    Stack.pop();
}
void addInteger(int & index) {

    for(++N; isdigit(Expression[index]); index++)
        Integer[N] = 10 * Integer[N] + (Expression[index] - '0');

    --index;
}
void Transform() {

    int i;

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

    for(i = 0; Expression[i]; i++) {

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

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

            Stack.pop();
        } else {
            while(!Stack.empty() && priority[Expression[i]] <= priority[Stack.top()])
                move();

            Stack.push(Expression[i]);
        }
    }

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

}
void Read() {

    ifstream in("evaluare.in");
    in.getline(Expression, Smax);
    in.close();
}
void Write() {

    ofstream out("evaluare.out");
    out << Result << '\n';
    out.close();
}
int main() {

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

    return 0;
}