基于栈的后缀算术表达式求值
描述
从键盘上输入一个后缀表达式,试编写算法计算表达式的值。规定:后缀表达式的长度不超过一行,以“=”作为输入结束,操作数之间用空格分隔,操作符只可能有+、−、*、/四种运算。
输入
多组数据,每组数据一行,对应一个后缀算术表达式,每个表达式均以“=”结尾。当表达式只有一个“=”时,输入结束。参加运算的数为double类型。
输出
对于每组数据输出一行,为表达式的运算结果。
样例输入1
1 2+8 2-7 4-/*=
1 2+=
1 2/=
=
样例输出1
6.00
3.00
0.50
解答:顺序读入字符串,分割出浮点数和运算符。开辟一个数据栈用于存放操作数和中间结果。读取字符串时,遇到浮点数则将浮点数入栈;遇到运算符则从数据栈中取出两个元素作为操作数进行运算,并将运算结果保存到数据栈。最终运算结果为数据栈栈顶元素。
#include<stdio.h>
#include<stack>
using namespace std;
double Fun(double a,double b,char op)
{
if(op=='+')
return a+b;
else if(op=='-')
return a-b;
else if(op=='*')
return a*b;
else if(op=='/')
return a/b;
}
int main()
{
int i;
double y;
double a,b;
char oper;
char s[100];
while(1)
{
gets(s);
if(s[0]=='=')
break;
int x=0;
int e=0,flag=0;
stack<double> data;
for(i=0; s[i]!='='; 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;
// printf("%.2f\n",y);
}
if(s[i]==' ')
continue;
b=data.top();
data.pop();
a=data.top();
data.pop();
oper=s[i];
y=Fun(a,b,oper);
data.push(y);
// printf("%.2f %c %.2f = %.2f\n",a,oper,b,y);
}
}
printf("%.2f\n",data.top());
}
return 0;
}