基于栈的中缀算术表达式求值
描述
输入一个中缀算术表达式,求解表达式的值。运算符包括+、-、*、/、(、)、=,参加运算的数为double类型且为正数。(要求:直接针对中缀算术表达式进行计算,不能转换为后缀或前缀表达式再进行计算,只考虑二元运算即可。)
输入
多组数据,每组数据一行,对应一个算术表达式,每个表达式均以“=”结尾。当表达式只有一个“=”时,输入结束。参加运算的数为double类型。
输出
对于每组数据输出一行,为表达式的运算结果。输出保留两位小数。
样例输入1
2+2= 20*(4.5-3)= =
样例输出1
4.00 30.00
解答:将输入字符串分割成浮点数和运算符。开辟一个符号栈和一个数据栈,初始化符号栈时将'='入栈。读取字符串遇到浮点数时将浮点数入数据栈;遇到运算符时,判断符号栈栈顶元素与当前运算符的优先关系。当优先关系为'>'时,取出符号栈栈顶元素作为运算符,取出数据栈顶端两个元素作为操作数,进行运算,并将运算结果存入数据栈中,当前符号不变;当优先关系为'<'时,将当前符号入符号栈,读取下一个字符;当优先关系为 '='时,将符号栈栈顶元素出栈,继续进行计算。
#include<stdio.h>
#include<stack>
using namespace std;
double Fun(double a,double b,char op)
{
if(op=='+')
return b+a;
else if(op=='-')
return b-a;
else if(op=='*')
return b*a;
else if(op=='/')
return b/a;
}
char Precede(char a,char b)
{
if((a=='('&&b==')')||(a=='='&&b=='='))
return '=';
else if(a=='('||a=='='||b=='('||(a=='+'||a=='-')&&(b=='*'||b=='/'))
return '<';
else
return '>';
}
int main()
{
int i;
double y;
double a,b;
char oper;
char s[100];
while(1)
{
scanf("%s",s);
if(s[0]=='=')
break;
int x=0;
int e=0,flag=0;
stack<double> data;
stack<char> op;
op.push('=');
for(i=0; s[i]!='\0'; i++)
{
if(s[i]>='0'&&s[i]<='9')
{
flag=1;
x=x*10+s[i]-'0';
if(e)
{
e*=10;
}
}
else if(s[i]=='.')
{
e=1;
}
else
{
if(flag)
{
if(e)
y=x*1.0/e;
else
y=x*1.0;
data.push(y);
x=0;
e=0;
flag=0;
}
while(1)
{
if(Precede(op.top(),s[i]) == '<')
{
op.push(s[i]);
break;
}
else if(Precede(op.top(),s[i]) == '>')
{
a=data.top();
data.pop();
b=data.top();
data.pop();
oper=op.top();
op.pop();
y=Fun(a,b,oper);
data.push(y);
}
else
{
op.pop();
break;
}
}
}
}
printf("%.2f\n",data.top());
}
return 0;
}