版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
244基于栈的后缀算术表达式求值
描述
从键盘上输入一个后缀表达式,试编写算法计算表达式的值。规定:后缀表达式的长度不超过一行,以“=”作为输入结束,操作数之间用空格分隔,操作符只可能有+、−、*、/四种运算。
输入
多组数据,每组数据一行,对应一个后缀算术表达式,每个表达式均以“=”结尾。当表达式只有一个“=”时,输入结束。
输出
对于每组数据输出一行,为表达式的运算结果。
输入样例 1
1 2+8 2-7 4-/=
1 2+=
1 2/=
=*
输出样例 1
6.00
3.00
0.50
#include<iostream>
#include<string>
using namespace std;
#define MAX 100
#define OK 0
#define ERROR -1
#define OVERFLOW -2
typedef struct
{
double *base;
double *top;
int stacksize;
}Stack;
int InitStack(Stack &S)
{
S.base=new double[MAX];
if(!S.base) return OVERFLOW;
S.top=S.base;
S.stacksize=MAX;
return OK;
}
int Push(Stack &S,double e)
{
if(S.top-S.base==S.stacksize)
return ERROR;
*S.top=e;
S.top++;
return OK;
}
int Pop(Stack &S)
{
if(S.top==S.base)
return ERROR;
S.top--;
return OK;
}
double Top(Stack S)
{
if(S.top==S.base)
return ERROR;
return *(S.top-1);
}
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()
{
char s[100];
while(cin.getline(s,100)&&s[0]!='=')
{
Stack data;
InitStack(data);
int i,x=0,e=0,flag=0;
double a,b,y;
char oper;
for(i=0;s[i]!='=';i++)
{
if(s[i]>='0'&&s[i]<='9')
{
flag=1;
x=x*10+s[i]-'0';
if(e!=0)
e=e*10;
}
else if(s[i]=='.')
e=1;
else
{
if(flag!=0)
{
if(e!=0)
y=x*1.0/e;
else
y=x*1.0;
Push(data,y);
x=0;
e=0;
flag=0;
}
if(s[i]==' ')
continue;
b=Top(data);
Pop(data);
a=Top(data);
Pop(data);
oper=s[i];
y=Fun(a,b,oper);
Push(data,y);
}
}
printf("%.2f\n",Top(data));
}
return 0;
}