Pagini recente » Cod sursa (job #2029350) | Cod sursa (job #2292849) | Cod sursa (job #124586) | Monitorul de evaluare | Cod sursa (job #1720150)
#include <fstream>
#include <string>
#include <vector>
using namespace std;
ifstream f{ "evaluare.in" };
ofstream q{ "evaluare.out" };
typedef struct _OPERATOR {
int prio;
char op;
struct _OPERATOR(const int& prio, const char&op) :prio { prio }, op{ op } {};
}OPERATOR;
vector<OPERATOR>stiva;
vector<int> coada;
int main() {
string expr;
f >> expr;
int prio = 1;
for (int i = 0; i < (int)expr.size();) {
if (expr[i] == '(') prio *= 100, i++;
else if (expr[i] == ')') prio /= 100, i++;
else {
if (expr[i] >= '0' && expr[i] <= '9') {
string nr = "";
nr += expr[i++];
while (i < (int)expr.size() && (expr[i] >= '0' && expr[i] <= '9')) nr += expr[i++];
int numar = stoi(nr);
coada.push_back(numar);
}
else {
int charprio = prio;
if (expr[i] == '+' || expr[i] == '-') charprio *= 5;
else charprio *= 10;
if (coada.size() < 2) stiva.push_back(OPERATOR(charprio, expr[i]));
else {
while (!stiva.empty() && stiva[stiva.size() - 1].prio >= charprio) {
int op1 = coada[coada.size() - 1];
int op2 = coada[coada.size() - 2];
char ch = stiva[stiva.size() - 1].op;
stiva.pop_back();
coada.pop_back(); coada.pop_back();
if (ch == '-') coada.push_back(op2 - op1);
if (ch == '+') coada.push_back(op1 + op2);
if (ch == '*') coada.push_back(op1*op2);
if (ch == '/') coada.push_back(op2 / op1);
}
stiva.push_back(OPERATOR(charprio, expr[i]));
}
++i;
}
}
}
while (!stiva.empty()) {
int op1 = coada[coada.size() - 1];
int op2 = coada[coada.size() - 2];
char ch = stiva[stiva.size() - 1].op;
stiva.pop_back();
coada.pop_back(); coada.pop_back();
if (ch == '-') coada.push_back(op2 - op1);
if (ch == '+') coada.push_back(op1 + op2);
if (ch == '*') coada.push_back(op1*op2);
if (ch == '/') coada.push_back(op2 / op1);
}
q << coada[0];
f.close();
q.close();
return 0;
}