表达式求值

#include <cstdio>
#include <cstring>
#include <stack>
using namespace std;
stack <char> operat;
stack <double> data;

double stof1(char* num){
	int i = 0,k1 =1,l=strlen(num);
	double k2=1.0,s=0.0,z=0.0,x=0.0;

	while(i<l){
		if(num[i]=='.') break;
		i++;
	}
	for(int j=i-1;j>=0;j--){
		z+=k1*(num[j]-'0');
		k1*=10;
	}
	for(int k=i+1;k<l;k++){
		k2/=10;
		x+=k2*(num[k]-'0');
	}
	return z+x;
}

int pr(char a,char b){
	if(a=='('||b=='(') return 1;
	else if((a=='+'||a=='-')&&(b=='*'||b=='/')) return 1;
	else if(a=='#'&&b!='#') return 1;
	return 0;
}


void baseop(){
	char a =operat.top();

	double n,m;
	switch(a){
		case '+':
		{
			n=data.top();
			data.pop();
			m=data.top();
			data.pop();
			m+=n;
			data.push(m);break;
		}
		case '-':
		{
			n=data.top();
			data.pop();
			m=data.top();
			data.pop();
			m-=n;
			data.push(m);break;
		}
		case '*':
		{
			n=data.top();
			data.pop();
			m=data.top();
			data.pop();
			m*=n;
			data.push(m);break;
		}
		case '/':
		{
			n=data.top();
			data.pop();
			m=data.top();
			data.pop();
			m/=n;
			data.push(m);break;
		}
	}
	operat.pop();
}

double solve(char* a){
	int l = strlen(a);
	for(int i=0;i<l;i++){
		if('0'<=a[i]&&a[i]<='9'){
			char j[1000];
			int k=0;
			while(a[i]>='0'&&a[i]<='9'||a[i]=='.'){
				
				sprintf(j+(k++),"%c",a[i++]);
			}
			double s = stof1(j);
			data.push(s); i--;
		}
		else while(!operat.empty()){
			if(a[i]==')'&&operat.top()=='('||(a[i]=='#'&&operat.top()=='#')){
				operat.pop();
				break;
			}
			else if(pr(operat.top(),a[i])){
				operat.push(a[i]);break;
			}
			else baseop();
		}
	}
	return data.top();
}
int main(){
	operat.push('#');
	char a[1000];
	scanf("%s",a);
	strcat(a,"#");
	printf("%lf",solve(a));
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值