Cod sursa(job #302051)

Utilizator vanila_CPPIonescu Victor Cristian vanila_CPP Data 8 aprilie 2009 17:07:28
Problema Evaluarea unei expresii Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <iostream>
#include <algorithm>
#include <cstring>
#define FIN "evaluare.in"
#define FOUT "evaluare.out"
#define MAX 100010
using namespace std;
char s[MAX-2];
int st[MAX];
int vf,vf_op;
char st_op[MAX];


int isnum(int c){

	if (c>='0' && c<='9'){ return 1;} else {return 0;}
}


void iofile(void){

	freopen(FIN,"rt",stdin);
	freopen(FOUT,"wt",stdout);

	fgets(s+1,MAX,stdin);
}


void bang_st(int op){

// 	printf("BANG! %d %d %c\n",st[vf-1],st[vf],op);
	if (op=='+'){ st[vf-1]+=st[vf];} else
	if (op=='-'){ st[vf-1]-=st[vf];} else
	if (op=='/'){ st[vf-1]/=st[vf];} else
	if (op=='*'){ st[vf-1]*=st[vf];}
	--vf;
	--vf_op;
}

int prio(int c){

	if (c=='+' || c=='(') { return 1;} else if (c=='-'){return 2;} else {return 3;}
}

void solve(void){

	int N=strlen(s+1);
	while ((!isnum(s[N]))&&(s[N]!='-' && s[N]!='+' && s[N]!='(' && s[N]!=')' && s[N]!='*' && s[N]!='/')) --N;

	int defnum=0;
	int num=0;
	vf=0;
	vf_op=0;

	for (int i=1;i<=N;++i){

		if (isnum(s[i])){defnum=1; num*=10; num+=s[i]-'0'; } else
		if (s[i]=='('){st_op[++vf_op]='('; if (defnum){st[++vf]=num; }; defnum=0;num=0;} else
		if (s[i]==')'){
			if (defnum){ st[++vf]=num;};
			while (st_op[vf_op]!='(') bang_st(st_op[vf_op]); defnum=0;num=0;
			--vf_op;
		} else {

			if (defnum){ st[++vf]=num;};
			defnum=0;
			num=0;
			if (vf_op>0 && prio(st_op[vf_op])>prio(s[i])) {
				while (vf_op>0 && st_op[vf_op]!='(') bang_st(st_op[vf_op]);
			}
			st_op[++vf_op]=s[i];
		}


	}
	if (defnum){st[++vf]=num;}
	while (vf_op) bang_st(st_op[vf_op]);
	printf("%d\n",st[1]);
	fclose(stdout);
}


int main(void){

	iofile();
	solve();
	return 0;
}