http://acm.hdu.edu.cn/showproblem.php?pid=1237
解题思路:栈模拟运算,考虑运算符的优先级
#include <stdio.h> #include <string.h> #define Max 205 /* 运算 */ double cal(double a,double b,char oper) { switch(oper) { case '+':return a+b; case '-':return a-b; case '*':return a*b; case '/':return a/b; } } /* 比较栈顶运算符和当前运算符优先级 */ char compare(char NewOper,char OldOper) { switch(NewOper) { case '+': if(OldOper == '+'||OldOper == '-')return '='; if(OldOper == '*'||OldOper == '/')return '<'; break; case '-': if(OldOper == '+'||OldOper == '-')return '='; if(OldOper == '*'||OldOper == '/')return '<'; break; case '*': if(OldOper == '+'||OldOper == '-')return '>'; if(OldOper == '*'||OldOper == '/')return '='; break; case '/': if(OldOper == '+'||OldOper == '-')return '>'; if(OldOper == '*'||OldOper == '/')return '='; break; } } int main() { char str[Max]; char oper[Max]; double num[Max]; double value; register int i; int len,LenOfOper,LenOfNum; while (gets(str)) { if(str[0]=='0'&&strlen(str)==1) break; len = strlen(str); LenOfNum=LenOfOper=0; for (i=0;i<len;i++) { if(str[i]>='0') { value=0; while (str[i]!=' '&&i!=len) { value=value*10+(str[i]-'0'); i++; } num[LenOfNum++]=value; continue; } else { if (LenOfOper!=0) { while ((compare(str[i],oper[LenOfOper-1])!='>')&&(LenOfOper>=1)&&(i!=len)) { num[LenOfNum-2]=cal(num[LenOfNum-2],num[LenOfNum-1],oper[LenOfOper-1]); LenOfOper--,LenOfNum--; } oper[LenOfOper++]=str[i++]; continue; } else { oper[LenOfOper++]=str[i]; ++i; } continue; } } while(LenOfOper&&LenOfOper>=1) { num[LenOfNum-2]=cal(num[LenOfNum-2],num[LenOfNum-1],oper[LenOfOper-1]); LenOfOper--,LenOfNum--; } printf("%.2lf/n",num[0]); } return 0; }