NYOJ35 表达式求值
来源:互联网 发布:电子地图综合采集软件 编辑:程序博客网 时间:2024/04/27 13:41
搞了差不多2天,原来一个是sstream的用法困惑好久,需要对数组清零
#include<iostream>#include<cstring>#include<sstream>#include<string>#include<cstring>#include<iomanip>#include<stack>using namespace std; char mid[1008],post[1008];char compare(char c,char d) //比较优先级 { switch(c) { case '+': case '-':if(d=='+'||d=='-'||d==')'||d=='=') return '>';else return '<';break; case '*': case '/':if(d=='+'||d=='-'||d=='*'||d=='/'||d==')'||d=='=') return '>';else return '<';break; case '(':if(d==')') return '='; if(d=='=') return '>';else return '<';break; case ')':if(d=='(') return '='; return '>';break; case '=':if(d=='=') return '='; else return '<';break; }}//字符串转换为double double To(char a[]){ stringstream oss; oss<<a; double result; oss>>result; return result;}bool ischar(char c){ if(c=='+'||c=='-'||c=='*'||c=='/'||c=='=') return true; return false;}void change(char mid[],char post[]){ stack<char> s1; char a[1000]; s1.push('='); int i=0,m=-1,l=strlen(mid); while(i<l) { char ch; if((mid[i]>='0'&&mid[i]<='9')||(mid[i]=='.')) { post[++m]=mid[i]; i++; } else { post[++m]=' '; if(compare(s1.top(),mid[i])=='<') { s1.push(mid[i]);i++;} else if(compare(s1.top(),mid[i])=='>') { ch=s1.top();s1.pop();post[++m]=ch;} else if(compare(s1.top(),mid[i])=='=') { s1.pop();++i;} } } } double Operator(double a,char b,double c){ if(b=='+') return a+c; if(b=='-') return a-c; if(b=='*') return a*c; if(b=='/') return a/c;} double run(char post[]){ int l=strlen(post); int i=0,flag=0; stack<double> str; char q[20]; memset(q,0,20); int j=-1; double result,x,y; while(i<l) { if(post[i]>='0'&&post[i]<='9'||post[i]=='.') { q[++j]=post[i]; flag=1; ++i; continue; } else { if(flag==1) { result=To(q);flag=0;j=-1;str.push(result); memset(q,0,20); //需要清零,某位大神的答疑,为什么呢,因为仅仅令j=-1的话,而数组后面下标为2,3之类的并没有清零,所以会发生转换错误,哎。 } if(post[i]==' ') i++; if(ischar(post[i])) { x=str.top();str.pop(); y=str.top(); str.pop(); str.push(Operator(y,post[i],x));++i; } } } return str.top();} int main(){ int n; cin>>n; while(n--) { cin>>mid; change(mid,post); cout<<setiosflags(ios::fixed)<<setprecision(2)<<run(post)<<endl; memset(post,0,1008); } system("pause"); return 0;}