题目链接:点击打开链接
题目大意:略。
解题思路:
注意1:末尾判断不是'\n',而是'\000'。
注意2:手动建栈。
AC 代码
inth,t; ElementTypesk[10000]; voidfpop() { t--; } ElementTypeftop() { returnsk[t]; } intfempty() { returnt==0?1:0; } voidfpush(ElementTypeval) { sk[++t]=val; } ElementTypeEvalPostfix( char*expr ) { charc,op; ElementTypenum=0,a,b; intlen=1, dot=0, fu=1, hasNum=0, blank=0; for(inti=0;;i++) { c=expr[i]; if(c=='\000') { if(hasNum&&!blank) returnnum*fu/len; // 测试点:单独一个数,直接输出elseif(hasNum&&blank) returnInfinity; // 末尾是操作数,而且不是整个表达式只有一个数num=ftop(), fpop(); if(!fempty()) returnInfinity; // 取完栈,发现还有操作数returnnum; } elseif(c==' ') { blank=1; num=num*fu/len; fpush(num); fu=len=1, hasNum=dot=num=0; } elseif(c>='0'&&c<='9') { hasNum=1; num=num*10+(c-'0'); if(dot) len*=10; } elseif(c=='.') { dot=1; } elseif(c=='-'&&expr[i+1]!=' '&&expr[i+1]!='\000') { fu=-1; } elseif(c=='+'&&expr[i+1]!=' '&&expr[i+1]!='\000') { } else { if(!fempty()) a=ftop(), fpop(); elsereturnInfinity; if(!fempty()) b=ftop(), fpop(); elsereturnInfinity; switch(c) { case'+': b+=a; fpush(b); break; case'-': b-=a; fpush(b); break; case'*': b*=a; fpush(b); break; case'/': if(a==0) returnInfinity; b/=a; fpush(b); break; default: returnInfinity; } if(b>=Infinity) returnInfinity; // 中间计算结果是否大于等于Infinityif(expr[i+1]==' ') i++; } } }