前缀式计算

来源:互联网 发布:长江证券软件下载 编辑:程序博客网 时间:2024/04/28 22:01

 题目链接:nyist 128http://acm.nyist.net/JudgeOnline/problem.php?pid=128 

知识点:
stringstream可以把string转换成double,int,long long等(方法2、3)
unget()可以把读出的字符放回字符串流中(方法2)
atof在stdlib.h中的把str字符串转换成double(方法3、4)
atoi在stdlib.h中的把str字符串转换成int;(方法3、4)
代码1:

#include<iostream>#include<string>#include<stdio.h>using namespace std;int pos;string str;double fun(){++pos;if(str[pos]==' ')++pos;if(str[pos]>='0'&&str[pos]<='9'){string s;while(pos!=str.size()&&str[pos]!=' ')s+=str[pos++];double tp;sscanf(s.c_str(),"%lf",&tp);return tp;}if(str[pos]=='+')return fun()+fun();if(str[pos]=='-')return fun()-fun();if(str[pos]=='*')return fun()*fun();if(str[pos]=='/')return fun()/fun();}int main(){while(getline(cin,str)){pos=-1;printf("%.2lf\n",fun());}}

代码2:

#include<iostream>#include<string>#include<stdio.h>#include<sstream>#include<stdlib.h>using namespace std;stringstream ss;//字符串流double fun(){char ch;double tp;ss>>ch;if(ch=='+')return fun()+fun();if(ch=='-')return fun()-fun();if(ch=='*')return fun()*fun();if(ch=='/')return fun()/fun();ss.unget();//把读出的ch字符放回ss字符串流中ss>>tp;    //从字符串流中读出double型数return tp;}int main(){string str;while(getline(cin,str)){ss.clear();ss<<str;printf("%.2lf\n",fun());}}

代码3:

#include<iostream>#include<string>#include<stdio.h>#include<sstream>#include<stdlib.h>using namespace std;stringstream ss;//字符串流double fun(){string str;ss>>str;if(str[0]=='+')return fun()+fun();if(str[0]=='-')return fun()-fun();if(str[0]=='*')return fun()*fun();if(str[0]=='/')return fun()/fun();return atof(str.c_str());//atof在stdlib.h中 把str字符串转换成double;//atoi在stdlib.h中 把str字符串转换成int;}int main(){string str;while(getline(cin,str)){ss.clear();ss<<str;printf("%.2lf\n",fun());}}

代码4:

#include<stdio.h>#include<stdlib.h>char str[20];double fun(){if(scanf("%s",str)==EOF)return 1<<30;if(str[0]=='+')return fun()+fun();if(str[0]=='-')return fun()-fun();if(str[0]=='*')return fun()*fun();if(str[0]=='/')return fun()/fun();return atof(str);//atof在stdlib.h中的把str字符串转换成double;        //atoi在stdlib.h中的把str字符串转换成int;}int main(){while(1){double tp=fun();if(tp<1<<30)printf("%.2lf\n",tp);elsebreak;}}