Cod sursa(job #3196173)

Utilizator Manolea_Teodor_StefanManolea Teodor Stefan Manolea_Teodor_Stefan Data 22 ianuarie 2024 23:11:09
Problema Evaluarea unei expresii Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.29 kb
// Utilizam stiva si inverse polish notation
#include <bits/stdc++.h>

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

string ec;
string newEc;
stack<char> op;
stack<long long> nr;

int main() {
    getline(fin,ec);
    for (int i = 0; i < ec.size(); i++) {
        if (ec[i] >= '0' && ec[i] <= '9') {
            while (ec[i] >= '0' && ec[i] <= '9') {
                newEc += ec[i];
                i++;
            }
            newEc += ' ';
        }
        if (ec[i] == '(') {
            op.push(ec[i]);
        } else if (ec[i] == ')') {
            while (op.top() != '(') {
                newEc += op.top();
                newEc += ' ';
                op.pop();
            }
            op.pop();
        }
        if (ec[i] == '-' || ec[i] == '+') {
            while (!op.empty() && (op.top() == '*' || op.top() == '/')) {
                newEc += op.top();
                newEc += ' ';
                op.pop();
            }
            op.push(ec[i]);
        } else if (ec[i] == '*' || ec[i] == '/'){
            op.push(ec[i]);
        }
    }
    while (!op.empty()) {
        newEc += op.top();
        newEc += ' ';
        op.pop();
    }
   // fout << newEc;

    for (int i = 0; i < newEc.size(); i++) {
        if (newEc[i] >= '0' && newEc[i] <= '9') {
            int constanta = newEc[i] - '0';
            i++;
            while (newEc[i] >= '0' && newEc[i] <= '9') {
                constanta *= 10;
                constanta += newEc[i] - '0';
                i++;
            }
            nr.push(constanta);
        }
        if (newEc[i] == '-') {
            long long mem = nr.top();
            nr.pop();
            mem = nr.top() - mem;
            nr.pop();
            nr.push(mem);
        } else if (newEc[i] == '+') {
            long long mem = nr.top();
            nr.pop();
            mem += nr.top();
            nr.pop();
            nr.push(mem);
        } else if (newEc[i] == '*') {
            long long mem = nr.top();
            nr.pop();
            mem *= nr.top();
            nr.pop();
            nr.push(mem);
        } else if (newEc[i] == '/') {
            long long mem = nr.top();
            nr.pop();
            mem = nr.top() / mem;
            nr.pop();
            nr.push(mem);
        }
    }
    fout << nr.top();
    return 0;
}