Cod sursa(job #2184306)

Utilizator Cristian1997Vintur Cristian Cristian1997 Data 23 martie 2018 22:07:40
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <bits/stdc++.h>
using namespace std;
using uint = unsigned int;
using ll = long long;
using pii = pair<int, int>;
#define dbg(x) cerr<<#x": "<<(x)<<'\n'
#define dbg_v(x, n) {cerr<<#x"[]: ";for(long long _=0;_<n;++_)cerr<<(x)[_]<<' ';cerr<<'\n';}
#define all(v) v.begin(), v.end()
#define fi first
#define se second
#define INF 2000000010
#define MOD 1000000007
#define ST_SIZE 1048600
#define QMAX 
#define LMAX 1010
#define NMAX 1010

vector<char> operators;
vector<int> nums;
int priority[300];

void pop() {
	int b = nums.back(); nums.pop_back();
	int a = nums.back(); nums.pop_back();
	char op = operators.back(); operators.pop_back();
	
	int ret;
	switch(op) {
		case '+': ret = a + b; break;
		case '-': ret = a - b; break;
		case '*': ret = a * b; break;
		case '/': ret = a / b; break;
	}
	
	nums.push_back(ret);
}

int main()
{
	freopen("evaluare.in", "r", stdin);
	freopen("evaluare.out", "w", stdout);
	ios_base::sync_with_stdio(false);
	
	int i, x;
	string s;
	
	priority['('] = -1;
	priority['+'] = priority['-'] = 1;
	priority['*'] = priority['/'] = 2;
	
	cin >> s;
	s = '(' + s + ')';
	
	for(i = 0; i < s.length(); ) {
		if(s[i] == '(') {
			operators.push_back('(');
			++i;
		} else if(s[i] == ')') {
			while(!operators.empty() && operators.back() != '(') pop();
			
			operators.pop_back();
			++i;
		} else if('0' <= s[i] && s[i] <= '9') {
			x = 0;
			while('0' <= s[i] && s[i] <= '9') x = x * 10 + s[i] - '0', ++i;
			nums.push_back(x);
		} else {
			while(!operators.empty() && priority[operators.back()] >= priority[s[i]]) pop();
			
			operators.push_back(s[i++]);
		}
	}
	
	cout << nums.front() << '\n';
	
	return 0;
}