Cod sursa(job #1720166)

Utilizator M.AndreiMuntea Andrei Marius M.Andrei Data 21 iunie 2016 17:54:31
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
#include <fstream>
#include <string>
#include <vector>
using namespace std;

ifstream f{ "evaluare.in" };
ofstream q{ "evaluare.out" };

typedef struct _OPERATOR {
	unsigned long long prio;
	char op;
}OPERATOR;

vector<OPERATOR>stiva;
vector<long int> coada;

int main() {
	string expr;

	f >> expr;
	unsigned long long prio = 1;
	if (expr[0] == '-') coada.push_back(0);

	for (int i = 0; i < (int)expr.size();) {
		if (expr[i] == '(') prio *= 10, i++;
		else if (expr[i] == ')') prio /= 10, 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++];
				long int numar = stoi(nr);
				coada.push_back(numar);
			}
			else {
				unsigned long long charprio = prio;
				OPERATOR op;
				if (expr[i] == '+' || expr[i] == '-') charprio *= 2;
				else charprio *= 5;
				op.op = expr[i]; op.prio = charprio;
				if (coada.size() < 2) stiva.push_back(op);
				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(op);
				}
				++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;
}