Cod sursa(job #2855174)

Utilizator Chiri_Robert Chiributa Chiri_ Data 22 februarie 2022 10:42:05
Problema Evaluarea unei expresii Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.51 kb
#include <fstream>
#include <stack>

using namespace std;

ifstream fin("evaluare.in");
ofstream fout("evaluare.out");

char c[100001];
stack<int> nr;
stack<char> op;
int val;

void print() {
    stack<int> nr1 = nr;
    stack<char> op1 = op;
    fout << "nr: ";
    while (!nr1.empty()) {
        fout << nr1.top() << " ";
        nr1.pop();
    }
    fout << "\nop: ";
    while (!op1.empty()) {
        fout << op1.top() << " ";
        op1.pop();
    }
    fout << "\n" << endl;
}

int eval(int nr1, int nr2, char c) {
    if (c == '+') {
        return (nr2+nr1);
    } else if (c == '-') {
        return (nr2-nr1);
    } else if (c == '*') {
        return (nr2*nr1);
    } else {
        return (nr2/nr1);
    }
}

int main()
{
    fin.getline(c, 100001);
    for (int i = 0; c[i]; i++) {
        //fout << c[i] << endl;
        if (c[i] == '(') {
            op.push(c[i]);
        } else if (c[i] == '/') {
            op.push(c[i]);
        } else if (c[i] == '*') {
            while (!op.empty()) {
                if (op.top() != '/') {
                    break;
                }

                int nr1 = nr.top(); nr.pop();
                int nr2 = nr.top(); nr.pop();
                nr.push(eval(nr1, nr2, op.top()));
                op.pop();
            }
            op.push(c[i]);
        } else if (c[i] == '+' || c[i] == '-') {
            while (!op.empty()) {
                if (op.top() != '*' && op.top() != '/') {
                    break;
                }

                int nr1 = nr.top(); nr.pop();
                int nr2 = nr.top(); nr.pop();
                nr.push(eval(nr1, nr2, op.top()));
                op.pop();
            }
            op.push(c[i]);
        } else if (c[i] == ')') {
            while (!op.empty()) {
                if (op.top() == '(') {
                    break;
                }

                int nr1 = nr.top(); nr.pop();
                int nr2 = nr.top(); nr.pop();
                nr.push(eval(nr1, nr2, op.top()));
                op.pop();
            }
            op.pop();
        } else {
            val = val*10 + c[i] - '0';
            if (!isdigit(c[i+1])) {
                nr.push(val);
                val = 0;
            }
        }
        //print();
    }
    while (!op.empty()) {
        int nr1 = nr.top(); nr.pop();
        int nr2 = nr.top(); nr.pop();
        nr.push(eval(nr1, nr2, op.top()));
        op.pop();
    }
    fout << nr.top();
    return 0;
}