中缀式 变 前缀试,变后缀试,然后表达式求值

来源:互联网 发布:郑爽白莲花邪教知乎 编辑:程序博客网 时间:2024/04/30 15:53
/****自己以为自己代码差不多了,做了这道题才知道还远着呢http://acm.nyist.net/JudgeOnline/problem.php?pid=409,擦,吐槽一下,六,七个小时的受不了*///////#include<ctype.h>#include<cstdio>#include<string>#include<queue>#include<algorithm>#include<stack>#include<iostream>using namespace std;int _pri(char s){    switch(s)    {        case '=':return -1;break;        case '+':return 0;break;        case '-':return 0;break;        case '*':return 1;break;        case '/':return 1;break;        case '(':return 2;break;        case ')':return 2;break;    }}int _using(char c){    switch(c)    {        case '+':return -1;break;        case '-':return -2;break;        case '*':return -3;break;        case '/':return -4;break;    }}double totly(double *a,int n){    stack <double> x;    double sum =0;    for(int i=0;i<n;i++)    {        if(a[i]>=0)        x.push(a[i]);        else        {            double a1 = x.top();            x.pop();            double a2 = x.top();            x.pop();            if(a[i]==-1)            sum=(a1+a2);            else            if(a[i]==-2)            sum=(a2-a1);            else            if(a[i]==-3)            sum=(a2*a1);            else            if(a[i]==-4)            sum=(a2/a1);            x.push(sum);        }    }    return sum;}int main(){    int n,m;    double a[1000];    char _sory[1000];    int icase;    string str,str1;    stack <char> s;    stack <char> s1;    scanf("%d",&icase);    while(icase--){    string nus[1000];    cin>>str;    str1 = str;    n = str1.size();    m = 0;n-= 2;    s1.push('=');    while(n>=0&&!s1.empty()){    if(isdigit(str1[n])||str1[n]=='.'){    while(isdigit(str1[n])||str1[n]=='.')    nus[m] = str1[n--]+nus[m];    m++;    }    else{        if(str1[n]=='('){           while(!s1.empty()&&s1.top()!=')')  {           nus[m++]= s1.top();           s1.pop();           }          n--;          s1.pop();           }           else            if(!s1.empty()&&_pri(s1.top())<=_pri(str1[n])){        s1.push(str1[n--]);        }        else        {            while(!s1.empty()&&_pri(s1.top())>_pri(str1[n])&&s1.top()!=')'){                  nus[m++] = s1.top();                  s1.pop();            }            s1.push(str1[n--]);        }      }    }    while(!s1.empty()){      nus[m++]= s1.top();      s1.pop();    }    m -= 2;    for(;m>=0;m--)    cout<<nus[m]<<" ";    cout<<"="<<endl;    int cur = 0;    char ch = *str.begin();    while(ch != '=')    {        if(ch<='9'&&ch>='0'){        int cn = 0;           while(ch<='9'&&ch>='0'||ch=='.'){               _sory[cn++] = ch;               str.erase(str.begin());               ch = *str.begin();           }           _sory[cn] = '\0';           cout<<_sory<<" ";           a[cur++] = atof(_sory);        }        else{            if(s.empty())s.push(ch);            else{                if(ch==')')                {                    while(!s.empty()&&s.top()!='('){                        cout<<s.top()<<" ";                        a[cur++] = _using(s.top());                        s.pop();                    }                  if(!s.empty()) s.pop();                }                else                if((_pri(s.top())<_pri(ch)))                       s.push(ch);                else                {                    while(!s.empty()&&_pri(s.top())>=_pri(ch)&&s.top()!='('){                    cout<<s.top()<<" ";                    a[cur++] = _using(s.top());                    s.pop();                    }                    s.push(ch);                }            }            str.erase(str.begin());            ch = *str.begin();        }        }       while(!s.empty()){        cout<<s.top()<<" ";        a[cur++] = _using(s.top());        s.pop();    }    cout<<"="<<endl;    printf("%.2lf\n",totly(a,cur));    }}