Cod sursa(job #1451852)

Utilizator al.mocanuAlexandru Mocanu al.mocanu Data 18 iunie 2015 18:31:03
Problema Evaluarea unei expresii Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <stdio.h>
#include <vector>
#include <string.h>
#include <stdlib.h>
#define MAX 100000
using namespace std;

int eval();

vector<char> s;
	int v[MAX], n;
	char* expr = (char*)malloc(MAX);

int main(){
	freopen("evaluare.in", "r", stdin);
	freopen("evaluare.out", "w", stdout);
	scanf("%s", expr);

	int x = 0, i;
	n = 0;

	for(i = 0; i < strlen(expr); i++){
		if('0' <= expr[i] && expr[i] <= '9')
			x = 10 * x + expr[i] - '0';
		
		else{
			if(i > 0 && '0' <= expr[i - 1] && expr[i - 1] <= '9'){
				v[n++] = x;
				x = 0;
			}

			if(expr[i] == '(')
				s.push_back(expr[i]);

			if(expr[i] == ')'){
				while(s.back() != '('){
					v[n++] = s.back() - 48;
					s.pop_back();
				}
				s.pop_back();
			}

			if(expr[i] == '*' || expr[i] == '/'){
				while(!s.empty() && (s.back() == '*' || s.back() == '/')){
					v[n++] = s.back() - 48;
					s.pop_back();
				}
				s.push_back(expr[i]);
			}

			if(expr[i] == '+' || expr[i] == '-'){
				while(!s.empty() && s.back() != '('){
					v[n++] = s.back() - 48;
					s.pop_back();
				}
				s.push_back(expr[i]);
			}
		}
	}

	if(x != 0)
		v[n++] = x;
	
	while(!s.empty()){
		v[n++] = s.back() - 48;
		s.pop_back();
	}
	printf("%d\n", eval());
	return 0;
}

int eval(){
	int i, rez = 0, a, b;
	vector<int> s;
	for(i = 0; i < n; i++){
		if(v[i] >= 0)
			s.push_back(v[i]);
		else{
			b = s.back();
			s.pop_back();
			a = s.back();
			s.pop_back();
			switch(v[i]){
				case -6: rez = a * b; break;
				case -5: rez = a + b; break;
				case -3: rez = a - b; break;
				case -1: rez = a / b; break;
			}
			s.push_back(rez);
		}
	}

	return s.back();
}