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;}