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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_43722827/article/details/102755224

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

猜你喜欢

转载自blog.csdn.net/weixin_43722827/article/details/102755224