51nod3425 中缀表达式求值

3425 中缀表达式求值

现在给你一个中缀表达式,式子中包括+-*/()六种运算符号,要求你求出这个中缀表达式的值。
中缀表达式:所谓中缀表达式就是我们平常写的算式,例如1+2、(1+2)*3。

输入

输入一个中缀表达式。

输出

输出一行,表示表达式的值。
可使用以下语句保留固定长度的小数点后尾数
C++:cout<<setiosflags(ios::fixed)<<setprecision(6)<<ans<<endl;
C:printf("%.6lf\n", ans);

输入样例

( 11.0  + 12.0  ) * ( 24.0 + 35.0 )

输出样例

1357.000000

解析:

根据题意,直接用两个栈模拟即可,一个数字栈,一个符号栈,注意计算的优先级即可,时间复杂度O(表达式长度)。

放代码:

#include <bits/stdc++.h>
using namespace std;
stack<double>num;
stack<char>op;
void cal(){
	double a=num.top();
	num.pop();
	double b=num.top();
	num.pop();
	char c=op.top();
	op.pop();
	double d;
	if(c=='+')d=b+a;
	if(c=='-')d=b-a;
	if(c=='*')d=b*a;
	if(c=='/')d=b/a;
	num.push(d);
}
char s[100][101];
int main(){
	int n=1;
	s[0][0]='(';
	while(cin>>s[n++]&&strcmp(s[n-1],"333"));
	s[n-1][0]=')';
	for(int i=0; i<n; i++){
		if(s[i][0]>='0'&&s[i][0]<='9')num.push(atof(s[i]));
		else{
			char c=s[i][0];
			if(c=='(')op.push(c);
			if(c=='-'||c=='+'){
				if(strlen(s[i])>1)num.push(atof(s[i]));
				else{
					while(op.top()!='(')cal();
					op.push(c);
				}
			}
			if(c=='*'||c=='/'){
				while(op.top()=='*'||op.top()=='/')cal();
				op.push(c);
			}
			if(c==')'){
				while(op.top()!='(')cal();
				op.pop();
			}
		}
	}
	if(num.top()==0)cout<<"0.000000";
	else printf("%.6lf",num.top());
    return 0;
}

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值