Cod sursa(job #1467230)

Utilizator RuxyRezidentTMRuxandra P RuxyRezidentTM Data 3 august 2015 01:22:42
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.98 kb
#include <fstream>
#include <vector>
#include <string>
using namespace std;

char text[100001], postfix[100001];
vector<int> numbers;
vector<char> expression;
ifstream f("evaluare.in");
ofstream g("evaluare.out");

int getNumber(int *i) {
    int number = 0;
    while(text[*i] >= '0' && text[*i] <= '9') {
        number = number * 10 + (text[*i] - '0');
        (*i)++;
    }
    return number;
}

int higherPreced(char a, char b) {
    if(a == '*' || a == '/')
        return 1;
    else {
        if( (a == '+' || a == '-' )  &&
             (b == '+' || b == '-') )
                return 1;
        else
            return 0;
    }


}
void parseText() {
    int i = 0, n = strlen(text), opN = -1;
    vector<char> opStack = vector<char>();
    expression = vector<char>();
    numbers = vector<int>();
    while(i < n) {


        if(text[i] == '+' || text[i] == '-'
           || text[i] == '*' || text[i] == '/') {

               while(opN >= 0 && higherPreced(opStack.at(opN), text[i])) {
                 expression.push_back(opStack.at(opN));
                 opStack.pop_back();
                 opN--;
                }
                opStack.push_back(text[i]);
                opN++;

        }
        else if(text[i] == '(') {

                opStack.push_back(text[i]);
                opN++;

            } else if(text[i] == ')') {

                while(opStack.at(opN) != '(') {
                    expression.push_back(opStack.at(opN));
                    opStack.pop_back();
                    opN--;
                }

            } else {

            expression.push_back('N');
            numbers.push_back(getNumber(&i));
            i--;

            }
        i++;
    }

    while(opN >= 0)  {
           if(opStack.at(opN) != '(')
                expression.push_back(opStack.at(opN));
            opStack.pop_back();
            opN--;
    }

}

int calculate() {

    int i = 0, n = expression.size(), nNumbers = 0, nStack = -1;
    vector<int> resultStack = vector<int>();
    while(i < n) {

        if(expression.at(i) == 'N') {
            resultStack.push_back(numbers.at(nNumbers));
            nStack++;
            nNumbers++;

        }

        else {

            int b = resultStack.at(nStack);
            int a = resultStack.at(nStack - 1);
            resultStack.pop_back();
            resultStack.pop_back();
            switch(expression.at(i)) {

            case '+':
                b = a + b;
                break;

            case '-':
                b = a - b;
                break;
            case '*':
                b = a * b;
                break;

            case '/':
                b = a / b;
                break;


            }
        resultStack.push_back(b);
        nStack--;

        }


        i++;
    }

    return resultStack.at(0);
}

int main()
{
    f>>text;
    parseText();
    g<<calculate();
    return 0;
}