您的位置:首页 > 其它

1959: 郁闷的C小加(二)

2017-08-10 16:53 169 查看

1959: 郁闷的C小加(二)

时间限制: 1 Sec  内存限制: 64 MB

提交: 5  解决: 3

[提交][状态][讨论版][Edit]
[TestData]

题目描述

聪明的你帮助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

提示

nyoj267

注意计算时操作数的计算顺序,先进的数为第一个操作数,后进的为第二个操作数,wa很久;

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<stack>
#include <cstdlib>
#include<cctype>
using  namespace std;
char str[1009]={0};

void compute(stack<double>& Num,stack<char>& Op) {
double b = Num.top();
Num.pop();
double a = Num.top();
Num.pop();
switch(Op.top()) {
case '+':
Num.push(a+b);
break;
case '-':
Num.push(a-b);
break;
case '*':
Num.push(a*b);
break;
case '/':
Num.push(a/b);
break;
}
Op.pop();//计算出结果,运算符号 出栈
}

double  yunsuan(double a,double b,char c){
if(c=='+') return a+b;
if(c=='-') return a-b;
if(c=='*') return a*b;
if(c=='/') return (a*1.0/b);
}

//优先级
int check(char a){

if(a=='+'||a=='-')

return 1;

if(a=='*'||a=='/')
return 2;

else return 0;
}
//中缀转换后缀
void trans(){
stack<char>st;
st.push('#');

for(int i=0;i<strlen(str);i++)
{
if(isdigit(str[i]))
{
char a[1000]={0};
sscanf(str+i,"%[0-9.]",a);
printf("%s",a);

i+=strlen(a)-1;

}

else if(str[i]=='(')
st.push('(');

else if(str[i]==')')
{
while(st.top()!='('&&st.size()!=1)
{
printf("%c",st.top());
st.pop();
}
st.pop();
}

else if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/')
{

while(check(st.top())>=check(str[i]))//不处理最后的等号
{
printf("%c",st.top());
st.pop();
}
st.push(str[i]);
}

}

while(st.top()!='#')
{
printf("%c",st.top());
st.pop();
}

printf("=\n");
}
//中缀计算
void  cal(){
stack<char>fuhao;
stack<double>num;

for(int i=0;i<strlen(str);i++)
{

if(str[i]>='0'&&str[i]<='9')
{
char  a[500]={0};
sscanf(str+i,"%[0-9.]",a);
i+=strlen(a)-1;
double b;//
b=atof(a);
num.push(b);
}

else if(str[i]=='(')
{
fuhao.push(str[i]);
}

else if(str[i]==')')
{
while(fuhao.top()!='(')
{

double  b=num.top();
num.pop();
double a=num.top();
num.pop();
char ch=fuhao.top();
fuhao.pop();
num.push(yunsuan(a,b,ch));

}
fuhao.pop();//'('出栈
}

else if(fuhao.empty()||check(str[i])>check(fuhao.top()))
fuhao.push(str[i]);

else {
while(!fuhao.empty()&&check(str[i])<=check(fuhao.top()))
{
double b = num.top();//后进的做操作数 即第二个数
num.pop();
double a = num.top();//先进的做被操作数 ,即第一个数
num.pop();
char ch=fuhao.top();	fuhao.pop();
num.push(yunsuan(a,b,ch));

//compute(num,fuhao);
}
fuhao.push(str[i]);
}

}
printf("%.2lf\n",num.top());

}

int main(){
int t;
scanf("%d",&t);

while(t--){
memset(str,0,sizeof(str));

scanf("%s",str);

trans();

cal();
printf("\n");
}
}




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息