BJFU_数据结构习题_244基于栈的后缀算术表达式求值

欢迎登录北京林业大学OJ系统
http://www.bjfuacm.com

244基于栈的后缀算术表达式求值

描述
从键盘上输入一个后缀表达式,试编写算法计算表达式的值。规定:后缀表达式的长度不超过一行,以“=”作为输入结束,操作数之间用空格分隔,操作符只可能有+、−、*、/四种运算。
输入
多组数据,每组数据一行,对应一个后缀算术表达式,每个表达式均以“=”结尾。当表达式只有一个“=”时,输入结束。
输出
对于每组数据输出一行,为表达式的运算结果。

输入样例 1
1 2+8 2-7 4-/=
1 2+=
1 2/=
=*
输出样例 1
6.00
3.00
0.50

#include
#include
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(1)
	{
		cin.getline(s,100);
		if(s[0]=='=')
			break;
		Stack data;
		InitStack(data);
		int i,x=0,e=0,flag=0;
		for(i=0;s[i]!='=';i++)
		{
			if('0'<=s[i]&&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==1)
				{
					double number=x;
					if(e!=0)
						number=number/e;
					push(data,number);
					x=e=flag=0;
				}
				if(s[i]==' ')
					continue;
				double b=top(data);
				pop(data);
				double a=top(data);
				pop(data);
				double oper=s[i];
				push(data,Fun(a,b,oper));
			}
		}
		printf("%.2f\n",top(data));
	}
	return 0;
}

你可能感兴趣的:(BJFU_数据结构)