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;
}