Cod sursa(job #151101)

Utilizator c_sebiSebastian Crisan c_sebi Data 7 martie 2008 20:11:31
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <fstream.h>
#include <stdlib.h>
#include <string.h>

int rez[100001], ks, krez;
char e[100001], s[100001];

void main(){
	int i=0, lg;
	ifstream f("evaluare.in");
	ofstream g("evaluare.out");
	f>>e;
	s[0]='^';
	ks=0; krez=0;
	lg = strlen(e);
	while(i<lg){
		if(e[i] >= '0' && e[i] <= '9') { rez[++krez]=0; while(e[i] >= '0' && e[i] <= '9') rez[krez]=rez[krez]*10 + e[i++]-'0'; i--;}
		else if(e[i] == '(') s[++ks] = e[i];
		else if(e[i] == '*' || e[i] == '/') {
				while(s[ks] == '*' || s[ks] == '/'){
					if(s[ks] == '*') rez[krez-1] *= rez[krez--];
					else if(s[ks] == '/') rez[krez-1] /= rez[krez--];
					ks--;
				}
				s[++ks]=e[i];
		}
		else if(e[i] == '+' || e[i]=='-'){
		while(s[ks] == '+' || s[ks] == '-' || s[ks] == '*'){
					if(s[ks] == '+') rez[krez-1] += rez[krez--];
					else if(s[ks] == '-') rez[krez-1] -= rez[krez--];
					else if(s[ks] == '*') rez[krez-1] *= rez[krez--];
					else if(s[ks] == '/') rez[krez-1] /= rez[krez--];
					ks--;
				}
				s[++ks]=e[i];
		}

		else if(e[i]==')'){
			while(s[ks]!='('){
				if(s[ks] == '+') rez[krez-1] += rez[krez--];
					else if(s[ks] == '-') rez[krez-1] -= rez[krez--];
					else if(s[ks] == '*') rez[krez-1] *= rez[krez--];
					ks--;
				}
			ks--;
		}
		i++;
	}
	 while(ks){
		if(s[ks] == '+') rez[krez-1] += rez[krez--];
		else if(s[ks] == '-') rez[krez-1] -= rez[krez--];
		else if(s[ks] == '*') rez[krez-1] *= rez[krez--];
		else if(s[ks] == '/') rez[krez-1] /= rez[krez--];
		ks--;
	 }
	 g<<rez[1]<<"\n";

}