Cod sursa(job #964685)

Utilizator RoxanaIstrateIstrate Roxana RoxanaIstrate Data 22 iunie 2013 01:56:18
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.37 kb
#include <fstream>
#include <string.h>
#include <iostream>
#include <cstdlib>
#include <stack>
#include <math.h>
#define max 100000
#define max2 10000
using namespace std;
char caract[max];
struct element{

	int x;
	char c;
	bool b;
};
element elems[max];
int size = 0;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
int prec(char c){
	
	switch(c){
		case '+':case '-': return 0; 
		case '*':case '/': return 1;
	}
}
bool is_digit(char c){
	return ('0' <= c) && (c <= '9');
}
bool is_operator(char c){
	return (c == '+') || (c == '-') || (c == '*') || (c == '/');
}
bool is_left(char c){
	return (c == '(');
}
bool is_right(char c){
	return (c == ')');
}
void polish(){
		
	int len = strlen(caract), ind = 0;
	char c, top;
	stack<char> mystack;
	while(ind < len){
		
		c = caract[ind];
		//cout<<"caracterul "<<c<<" \n";
		if(is_left(c)){
			// e paranteza "("
			mystack.push(c);
		}else{
			if(is_right(c)){
				// e paranteza ")"
				while(!mystack.empty() && (top = mystack.top()) != '('){
					mystack.pop();
					elems[size].c = top;
					elems[size].b = false;
					size++;
				}
				mystack.pop();
			}else{
				if (is_operator(c)){
					// este + - * sau /	
					while(!mystack.empty() && (top = mystack.top()) && is_operator(top) && prec(top) >= prec(c)){
						//cout<<"top "<<top<<"\n";
						//cout<<"c "<<c<<"\n";
						mystack.pop();
						elems[size].c = top;
						elems[size].b = false;
						size++;
					} 
					mystack.push(c);
				}else{
					// este cifra!! nu numar!!
					int number = c - 48;
					while(is_digit(caract[ind+1])){
						number = number * 10 + caract[ind+1] - 48;
						ind++;
					}
					elems[size].x = number;
					elems[size].b = true;
					size++;
				}	
			}
		}
		ind++;
	}
	while(!mystack.empty()){
		elems[size].c = mystack.top();
		elems[size].b = false;
		mystack.pop();
		size++;
	}	
}
int eval(char c, int nr1, int nr2){
	
	switch(c){
		case '+': return nr1+nr2;
		case '*': return nr1*nr2;
		case '/': return nr2/nr1;
		case '-': return nr2-nr1;
	}
}
void compute(){
		
	int i = 0, nr1, nr2;
	stack<int> mystack;
	for(i = 0; i < size; i++){
		if(elems[i].b == true){
			// daca e numar
			mystack.push(elems[i].x);
		}else{
			nr1 = mystack.top();
			mystack.pop();
			nr2 = mystack.top();
			mystack.pop();
			mystack.push(eval(elems[i].c,nr1,nr2));
		}
	}
	fout<<mystack.top();
	mystack.pop();
}
int main(){
	
	fin>>caract;
	polish();
	compute();
	return 0;
}