每日一题Day42

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

描述

输入一个中缀算术表达式,求解表达式的值。运算符包括+、-、*、/、(、)、=,参加运算的数为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;
}

猜你喜欢

转载自blog.csdn.net/ZLambert/article/details/81773359