Pagini recente » Cod sursa (job #1742643) | Cod sursa (job #3152034) | Cod sursa (job #1206633) | Cod sursa (job #1442021) | Cod sursa (job #392569)
Cod sursa(job #392569)
#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;
}