Bob讨厌复杂的数学运算. 看到练习册上的算术题,Bob很是头痛. 为了完成作业,Bob想要你帮忙写一个文本版的四则运算计算器. 这个计算器的功能需求十分简单,只要可以处理加减乘除和括号就可以了. 你能够帮助Bob吗?
标签:栈
Bob讨厌复杂的数学运算. 看到练习册上的算术题,Bob很是头痛. 为了完成作业,Bob想要你帮忙写一个文本版的四则运算计算器. 这个计算器的功能需求十分简单,只要可以处理加减乘除和括号就可以了. 你能够帮助Bob吗?
每个样例一行,输入一个长度小于1500的包含有‘(‘,‘)‘,‘+‘,‘-‘,‘*‘,‘/‘,和‘1‘~‘9‘组成的四则运算表达式. 对于每个样例,参与运算数字在0~10000之间,表达式运算的结果在double的表示范围内.
对于每一个例子,输出表达式的计算结果,精确到小数点后4位
3928*3180*3229+2137
2477*8638
1535+7452+3780+2061*280/3070/(7828-9348)
40333570297.0000 21396326.000012766.8763
#include<stdio.h> #include<iostream> #include<string.h> #include<math.h> using namespace std; const int N = 1505; char fh[N],s[N]; //符号栈,表达式 double num[N]; //数字栈 int ftop,ntop; //符号栈顶,数字栈顶 void calculate(){ if(fh[ftop]=='+') num[ntop-1]+=num[ntop],ntop--; else if(fh[ftop]=='-') num[ntop-1]-=num[ntop],ntop--; else if(fh[ftop]=='*') num[ntop-1]*=num[ntop],ntop--; else if(fh[ftop]=='/') num[ntop-1]/=num[ntop],ntop--; ftop--; } int main(){ while(scanf("%s",s)>0){ ftop=0;ntop=0; int flagNum=0,flagNode=0,slen=strlen(s); double ans=0,EE; for(int i=0; i<=slen; ++i){ if(i!=slen&&(s[i]>='0'&&s[i]<='9'||s[i]=='.')){ if(s[i]=='.')flagNode=1,EE=0.1; else{ if(flagNode){ ans+=(s[i]-'0')*EE; EE*=0.1; } else ans=ans*10+s[i]-'0'; flagNum=1; } } else{ if(flagNum)num[++ntop]=ans; flagNum=0; flagNode=0; ans=0; if(i==slen)break; if(s[i]=='+'||s[i]=='-'){ while(ftop&&fh[ftop]!='(') calculate(); fh[++ftop]=s[i]; } else if(s[i]==')'){ while(ftop&&fh[ftop]!='(') calculate(); ftop--; } else if(s[i]=='*'||s[i]=='/'){ while(ftop&&(fh[ftop]=='*'||fh[ftop]=='/')) calculate(); fh[++ftop]=s[i]; } else fh[++ftop]=s[i]; } } while(ftop) calculate(); printf("%.4f\n",num[1]); } }
标签:栈
原文地址:http://blog.csdn.net/u010372095/article/details/46290573