郁闷的C小加(三)(表达式求值)

C 郁闷的C小加(三)


内存限制:64MB  时间限制:1s  Special Judge: No

题目描述:

聪明的你帮助C小加解决了中缀表达式到后缀表达式的转换(详情请参考“郁闷的C小加(一)”),C小加很高兴。但C小加是个爱思考的人,他又想通过这种方法计算一个表达式的值。即先把表达式转换为前缀和后缀表达式,再求值。这时又要考虑操作数是小数和多位数的情况。

输入描述:

第一行输入一个整数T,共有T组测试数据(T<10)。
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数并且小于1000000。
数据保证除数不会为0。

输出描述:

对于每组测试数据输出结果包括三行,先输出转换后的前缀和后缀表达式,再输出计算结果,结果保留两位小数。

样例输入:

复制
2
1+2=
(19+21)*3-4/5=

样例输出:

+ 1 2 =
1 2 + =
3.00
- * + 19 21 3 / 4 5 =
19 21 + 3 * 4 5 / - =
119.20

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define ll long long
using namespace std;
char s[1100];
char sss[1100];
char ss[1100];
char buf[1100];
int aa(char a)
{
    switch(a)
    {
    case '-':
    case '+':
       return 1;
       break;
    case '/':
    case '*':
      return 2;
       break;
    case '(':
           return 0;
           break;
    case ')':
           return -1;
           break;
    default:
      return -2;
    }
}
double bb(char op,double k1,double k2)
{
	double k;
	switch (op)
	{
		case '+': k = k1+k2; break;
		case '-': k = k1-k2; break;
		case '*': k = k1*k2; break;
		case '/': k = k1/k2; break;
	}
	return k;
}
int main()
{
    int n;
    int o;
    scanf("%d",&n);
    while(n--)
    {
      stack<char>q;
      stack<double>p;
        o=0;
       scanf("%s",s);
       int k=strlen(s)-1;
        memset(sss,0,sizeof(sss));
       for(int i=0;i<k;i++)
        sss[i]=s[k-1-i];
       for(int i=0;i<k;i++)
       {
           if(aa(sss[i])==-1)
           {
               q.push(sss[i]);
               continue;
           }
           if(aa(sss[i])==-2)
           {
               ss[o++]=' ';
               sscanf(sss+i,"%[^=()+*/-]",buf);
               for(int j=0;j<strlen(buf);j++) ss[o++]=buf[j];
                  i+=strlen(buf)-1;
              continue;
           }
            if(aa(sss[i])==0)
           {
            while(!q.empty())
           {
               char u=q.top();
               q.pop();
               if(aa(u)==-1)
                   break;
               ss[o++]=' ';
               ss[o++]=u;
           }
               continue;
           }
            while(!q.empty())
           {
               char u=q.top();
               if(aa(u)>aa(sss[i]))
               {
                 ss[o++]=' ';
                 ss[o++]=u;
                   q.pop();
               }
               else
                 break;
           }
           q.push(sss[i]);
       }
          while(!q.empty())
           {
               char u=q.top();
               ss[o++]=' ';
               ss[o++]=u;
                q.pop();
           }
          for(int i=o-1;i>=0;i--)
            printf("%c",ss[i]);
           printf("=\n");
       o=0;
       for(int i=0;i<k;i++)
       {
           if(aa(s[i])==0)
           {
               q.push(s[i]);
               continue;
           }
           if(aa(s[i])==-2)
           {
               sscanf(s+i,"%[^=()+*/-]",buf);
               for(int j=0;j<strlen(buf);j++) ss[o++]=buf[j];
               ss[o++]=' ';
               i+=strlen(buf)-1;
               double kk=atof(buf);
               p.push(kk);
              continue;
           }
           if(aa(s[i])==-1)
           {
            while(!q.empty())
           {
               char u=q.top();
               q.pop();
               if(aa(u)==0)
                   break;
               ss[o++]=u;
               ss[o++]=' ';
               double k1=p.top(); p.pop();
               double k2=p.top();p.pop();
               p.push(bb(u,k2,k1));
           }
               continue;
           }
           while(!q.empty())
           {
               char u=q.top();
               if(aa(u)>=aa(s[i]))
               {
                   ss[o++]=u;
                   ss[o++]=' ';
               double k1=p.top(); p.pop();
               double k2=p.top();p.pop();
                 p.push(bb(u,k2,k1));
                   q.pop();
               }
               else
                 break;
           }
           q.push(s[i]);
       }
         while(!q.empty())
           {
               char u=q.top();
               ss[o++]=u;
               ss[o++]=' ';
                q.pop();
                double k1=p.top(); p.pop();
               double k2=p.top();p.pop();
                p.push(bb(u,k2,k1));
           }
           for(int i=0;i<o;i++)
            printf("%c",ss[i]);
           printf("=\n");
           printf("%.2lf\n",p.top());
    }
}



猜你喜欢

转载自blog.csdn.net/dsaghjkye/article/details/80342920