Cod sursa(job #392569)

Utilizator nandoLicker Nandor nando Data 7 februarie 2010 19:19:58
Problema Evaluarea unei expresii Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.96 kb
#include <cstdio>


struct op{
	bool isOp;
	int val;
	op():val(0),isOp(false){};
	op(char _val,bool _isOp):val(_val),isOp(_isOp){};
}post[100005];

char stk[10000];
unsigned pl=0,sc=1,lst=0;

int opPrior(char op)
{
    switch(op){
        case '*':case '/':
             return 2;
        case '+':case '-':
             return 1;
        default:
             return 0;               
    }   
}
bool isOp(char op)
{
     switch(op){
		case '+':case '-':
		case '*':case '/':
		case '(':case ')':
			return true;
		default:
			return false;
     }
}
int doOp(int op1,int op2,char op){
	switch(op){
		case '+':
			return op1+op2;
		case '-':
			return op1-op2;
		case '*':
			return op1*op2;
		case '/':
			return op1/op2;
		default:
			return 0;
	}
}
void doChar(op c){
    if(!c.isOp){
	    if(lst){
			post[pl-1].val=post[pl-1].val*10+int(c.val-'0');
	    }else{
			post[pl++].val=c.val-'0';
			lst=1;
		}
    }else{
		lst=0;
		if(c.val=='('){
			stk[++sc]='(';
		}else if(c.val==')'){
			while(sc>0&&stk[sc]!='('){
				post[pl++].val=stk[sc--];
				post[pl-1].isOp=true;
			}
			sc--;
		}else{
			if(opPrior(c.val)>opPrior(stk[sc])){
				stk[++sc]=c.val;
			}else{
				while(sc>0&&opPrior(c.val)<=opPrior(stk[sc])&&stk[sc]!='('){
					post[pl++].val=stk[sc--];
					post[pl-1].isOp=true;
				}
				stk[++sc]=c.val;
			}
		}
	}
}
int main()
{
    FILE* fin=fopen("evaluare.in","r");
	FILE* fout=fopen("evaluare.out","w");
	char ch=fgetc(fin);
	doChar(op('(',true));
    while('0'<=ch&&ch<='9'||isOp(ch)||ch=='('||ch==')'){
		doChar(op(ch,isOp(ch)));
		ch=fgetc(fin);            
    }
	doChar(op(')',true));
	for(int i=0;i<pl;i++){
		if(post[i].isOp){
			post[i].val=doOp(post[i-2].val,post[i-1].val,post[i].val);
			post[i].isOp=false;
			for(int j=i;j<pl;j++){
				post[j-2]=post[j];
			}
			i-=2;
			pl-=2;
		}
	}
	fprintf(fout,"%u",post[0].val);
    fclose(fin);
	fclose(fout);
    return 0;
}