PTA.7-2后缀式求值

我们人类习惯于书写“中缀式”,如 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;
}

猜你喜欢

转载自blog.csdn.net/qq_52898168/article/details/121454956