我们人类习惯于书写“中缀式”,如 3 + 5 * 2
,其值为13
。 (p.s. 为什么人类习惯中缀式呢?是因为中缀式比后缀式好用么?)
而计算机更加习惯“后缀式”(也叫“逆波兰式”,Reverse Polish Notation)。上述中缀式对应的后缀式是: 3 5 2 * +
现在,请对输入的后缀式进行求值。
输入格式:
在一行中输入一个后缀式,运算数
和运算符
之间用空格分隔,运算数长度不超过6
位,运算符仅有+ - * /
四种。
输出格式:
在一行中输出后缀式的值,保留一位小数。
输入样例:
3 5.4 2.2 * +
结尾无空行
输出样例:
14.9
注意:不要忘记输入的数可能为负 如:输入 -6 3 + ,答案应该为 -3
#include<stdio.h>
#include<string.h>
double q[101];
int main()
{
char s[101];
gets(s);
double x=0,y=0,n,m;
int f=0,mark=0,l=strlen(s),top=0,k,flag=1;
for(int i=0; i<l; i++)
{
if(s[i]==' ')
{
f=0;//用与分割整数部分与小数部分
if(!flag)x=-x;// 判断x是否为负
if(mark) //预防数与数 ,或数与运算符之间有连续空格,其实没必要,题意已经说明
q[top++]=x;
flag=1;
x=0;
mark=0;
}
else if(s[i]=='-'&&!(s[i+1]>='0'&&s[i+1]<='9'))
{
n=q[--top];
m=q[--top];
q[top++]=m-n;
}
else if(s[i]=='*'&&!(s[i+1]>='0'&&s[i+1]<='9'))
{
n=q[--top];
m=q[--top];
q[top++]=m*n;
}
else if(s[i]=='/'&&!(s[i+1]>='0'&&s[i+1]<='9'))
{
n=q[--top];
m=q[--top];
if(!n)return 0;
q[top++]=m/n;
}
else if(s[i]=='+'&&!(s[i+1]>='0'&&s[i+1]<='9'))
{
n=q[--top];
m=q[--top];
q[top++]=m+n;
}
else
{
if(s[i]=='-')flag=0;
else if(s[i]=='.')
f=1,k=10;
else
{
if(f)
{
x+=(s[i]-'0')*1.0/k;
k*=10;
}
else
{
x=x*10+(s[i]-'0');
mark=1;
}
}
}
}
printf("%.1lf",q[0]);
return 0;
}