Font Size: ← →
Problem Description
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
Sample Input
1 + 2 4 + 2 * 5 - 7 / 11 0
Sample Output
3.00 13.36
//利用栈的原理来做,数字在一块,运算在一块。
不过不知道为什么G++不能Ac,而C++可以
源代码:
#include<stdio.h>
#include<string.h>
int main()
{
char ss[220];
int i,j;
int op_top;
int num_top;
int temp;
double sum;
char stack_op[220];
double stack_num[220];
while(gets(ss)&&!(strlen(ss)==1&&ss[0]=='0'))
{
op_top=num_top=0;
memset(stack_op,0,sizeof(stack_op));
memset(stack_num,0,sizeof(stack_num));
i=0;
while(ss[i]!='\0')
{
if(ss[i]==' ')
{
i++;
continue;
}
if(ss[i]>='0'&&ss[i]<='9'&&!(stack_op[op_top]=='*'||stack_op[op_top]=='/'))
{
temp=0;
while(ss[i]>='0'&&ss[i]<='9')
{
temp=temp*10+ss[i]-'0';
i++;
}
stack_num[++num_top]=temp;
continue;
}
if(ss[i]>='0'&&ss[i]<='9'&&(stack_op[op_top]=='*'||stack_op[op_top]=='/'))
{
temp=0;
while(ss[i]>='0'&&ss[i]<='9')
{
temp=temp*10+ss[i]-'0';
i++;
}
if(stack_op[op_top]=='*')
{
stack_num[num_top]=1.0*stack_num[num_top]*temp;
op_top--;
continue;
}
if(stack_op[op_top]=='/')
{
stack_num[num_top]=(1.0*stack_num[num_top])/temp;
op_top--;
continue;
}
op_top--;
}
if(ss[i]=='+'||ss[i]=='-'||ss[i]=='*'||ss[i]=='/')
{
stack_op[++op_top]=ss[i];
i++;
continue;
}
}
sum=0;
while(num_top>1)
{
if(stack_op[op_top]=='+')
{
sum+=(0+stack_num[num_top]);
}
if(stack_op[op_top]=='-')
{
sum+=(0-stack_num[num_top]);
}
num_top--;
op_top--;
}
if(stack_num[1]+sum==0)
printf("0\n");
else
printf("%.2f\n",stack_num[1]+sum);
}
return 0;
}
更简单的做法
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
using namespace std;
int main()
{
double num[300],t,sum;
int i;
char op;
while(cin>>t)
{
memset(num,0,sizeof(num));
num[0]=t;
i=0;
op=getchar();
if(op=='\n'&&t==0)break;
while(1)
{
cin>>op>>t;
if(op=='*')num[i]*=t;
else if(op=='/')num[i]/=t;
else if(op=='+')num[++i]=t;
else num[++i]=-t;
if(getchar()=='\n')break;
}
for(sum=0;i>=0;i--)
sum+=num[i];
printf("%.2lf\n",sum);
}
return 0;
}