郁闷的C小加(二)
内存限制:64MB 时间限制:1s Speci 题目描述:
聪明的你帮助C小加解决了中缀表达式到后缀表达式的转换(详情请参考“郁闷的C小加(一)”),C小加很高兴。但C小加是个爱思考的人,他又想通过这种方法计算一个表达式的值。即先把表达式转换为后缀表达式,再求值。这时又要考虑操作数是小数和多位数的情况。
输入描述:
第一行输入一个整数T,共有T组测试数据(T<10)。每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数并且小于1000000。数据保证除数不会为0。
输出描述:
对于每组测试数据输出结果包括两行,先输出转换后的后缀表达式,再输出计算结果,结果保留两位小数。两组测试数据之间用一个空行隔开。
样例输入:
复制
21+2=(19+21)*3-4/5=
样例输出:
12+=3.001921+3*45/-=119.20
提示:
没有提示哦
来源:
改编自NYOJ
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<map>
#include<set>
#include<stack>
#include<vector>
#define ll long long
using namespace std;
char s[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;
stack<char>q;
stack<double>p;
scanf("%d",&n);
int yy=n;
while(n--)
{
if(n!=yy-1) printf("\n");
o=0;
scanf("%s",s);
int k=strlen(s)-1;
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];
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;
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;
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;
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());
}
}