表达式求值

#include "stdio.h"
#include "string.h"
#include "math.h"
const int NO=105;
struct OP{
	char s[NO];
	int top;
}op;
struct DA{
	double s[NO];
	int top;
}da;

char comp(char ch1,char ch2)
{
	char s[]={'+','-','*','/','(',')','#','^'};
	char ss[8][8]={ 
		            '>','>','<','<','<','>','>','<', 
                    '>','>','<','<','<','>','>','<',
					'>','>','>','>','<','>','>','<',
					'>','>','>','>','<','>','>','<',
					'<','<','<','<','<','=','E','<',
					'>','>','>','>','E','>','>','>',
					'<','<','<','<','<','E','=','<',
					'>','>','>','>','<','>','>','<',
};
	int aaa[256];
	for(int i=0;i<8;i++)
		aaa[s[i]]=i;
	return ss[aaa[ch1]][aaa[ch2]];
}

double cal(double a,char ch,double b)
{
	switch(ch)
	{
	case '+':return a+b; break;
	case '-':return a-b; break;
	case '*':return a*b; break;
	case '/':return a/b; break;
	case '^':return pow(a,b);break;
	}
}

double expresion(char s[])
{
	char temp[105];
	double result,n;
	op.top=0;
	da.top=0;
	op.s[++op.top]='#';
	int i=0,j=0;
	while(s[i]!='#' || op.s[op.top]!='#')
	{
		if(i==0 && s[0]=='-' || (s[i]=='-' && s[i-1]=='('))
			da.s[++da.top]=0;
		if(s[i]>='0' && s[i]<='9' ||s[i]=='.')
		{
			int k=0;
			while(s[i]>='0' && s[i]<='9' ||s[i]=='.')
			{ 
				
				temp[k++]=s[i++];
			}
			temp[k]='\n';
			sscanf(temp,"%lf",&da.s[++da.top]);
		}
		else switch(comp(op.s[op.top],s[i]))
		{
              case '>': n=cal(da.s[da.top-1],op.s[op.top--],da.s[da.top]);
				        da.top-=2;
						da.s[++da.top]=n;
				        break;
			  case '<': op.s[++op.top]=s[i]; i++; break;
			  case '=': op.top--; i++; break;
		}
	}
	
	return da.s[da.top];
}

int main()
{
	char s[NO];
	gets(s);
	strcat(s,"#");
	printf("%.3f\n",expresion(s));
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值