1655 文本计算器
1655: 文本计算器
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 58 Solved: 16
[Submit][Status][Web Board]
Description
Input
Output
Sample Input
Sample Output
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 58 Solved: 16
[Submit][Status][Web Board]
Description
Bob讨厌复杂的数学运算. 看到练习册上的算术题,Bob很是头痛. 为了完成作业,Bob想要你帮忙写一个文本版的四则运算计算器. 这个计算器的功能需求十分简单,只要可以处理加减乘除和括号就可以了. 你能够帮助Bob吗?
Input
每个样例一行,输入一个长度小于1500的包含有'(',')','+','-','*','/',和'1'~'9'组成的四则运算表达式. 对于每个样例,参与运算数字在0~10000之间,表达式运算的结果在double的表示范围内.
Output
对于每一个例子,输出表达式的计算结果,精确到小数点后4位
Sample Input
3928*3180*3229+2137 2477*8638 1535+7452+3780+2061*280/3070/(7828-9348)
Sample Output
40333570297.0000 21396326.0000
12766.8763
思路:用栈先进后出的特点,存入后将可计算得先计算得到结果后再存入,进行下一项计算。
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> using namespace std; const int MAX=1505; char data[MAX]; double num[MAX]; //存数字 char sign[MAX]; //存符号 int ntop,stop; //标记栈顶元素的位置 double sum; //结果 void count() //基本的+-*/运算 { if(sign[stop]=='+') { num[ntop-1]+=num[ntop]; ntop--; } else if(sign[stop]=='-') { num[ntop-1]-=num[ntop]; ntop--; } else if(sign[stop]=='*') { num[ntop-1]*=num[ntop]; ntop--; } else if(sign[stop]=='/') { num[ntop-1]/=num[ntop]; ntop--; } stop--; } int main() { int len; while(~scanf("%s",data)) { ntop=0; stop=0; int markn=0,marks=0,marknode=0,ans=0,nodes; len=strlen(data); for(int i=0;i<=len;i++) { if(i!=len&&(data[i]>='0'&&data[i]<='9'||data[i]=='.')) { if(data[i]=='.')//小数 { marknode=1;//标记 nodes=0.1; } else { if(marknode) { ans=ans+(data[i]-'0')*nodes; nodes=nodes*0.1; } else ans=ans*10+data[i]-'0'; markn=1; } } else { if(markn) { num[++ntop]=ans; markn=0; marknode=0; ans=0; } if(i==len)break; if(data[i]=='-'||data[i]=='+') { while(stop&&sign[stop]!='(') count(); sign[++stop]=data[i]; } else if(data[i]=='*'||data[i]=='/') { while(stop&&(sign[stop]=='*'||sign[stop]=='/')) count(); sign[++stop]=data[i]; } else if(data[i]==')') { while(stop&&sign[stop]!='(') count(); stop--; } else sign[++stop]=data[i]; } } while(stop) count(); printf("%.4lf\n",num[1]); } }