波兰表达式

7-14 求前缀表达式的值 (25 分)

算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。

输入格式:

输入在一行内给出不超过30个字符的前缀表达式,只包含+-*\以及运算数,不同对象(运算数、运算符号)之间以空格分隔。

输出格式:

输出前缀表达式的运算结果,保留小数点后1位,或错误信息ERROR

输入样例:

+ + 2 * 3 - 7 4 / 8 4

输出样例:

13.0
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
double exp()
{
	char a[50];
	scanf("%s",a);
	if(!a[1])
	{
		switch(a[0])
	{
	  case '+' : return exp()+exp(); 
	  case '-' : return exp()-exp(); 
	  case '*' : return exp()*exp(); 
	  case '/' :
	{ double fenzi = exp(); 
	  double fenmu = exp(); 
	 if(fenmu !=0) 
		return 
			fenzi/fenmu; 
	else 
	{ 
		printf("ERROR"); 
		exit(0); 
	} 
	} 
	default : return atof(a); 
	} 
	} 
	else
	{ 
	if( a[0]=='-' || a[0]=='+') 
	{ 
	char flag = a[0]; 
	int i =0 ; 
	while(a[i]) 
	{ 
		a[i] = a[i+1]; 
		i++; 
	} 
	if(flag=='-') 
		return 0-atof(a); 
	else 
		return atof(a);
	} 
	else 
		return atof(a); 
	} }

int main()
{
	printf("%.lf",exp());
	return 0;
}

7-1 逆波兰表达式求值 (20 分)

逆波兰表示法是一种将运算符(operator)写在操作数(operand)后面的描述程序(算式)的方法。举个例子,我们平常用中缀表示法描述的算式(1 + 2)*(5 + 4),改为逆波兰表示法之后则是1 2 + 5 4 + *。相较于中缀表示法,逆波兰表示法的优势在于不需要括号。
请输出以逆波兰表示法输入的算式的计算结果。

输入格式:

在一行中输入1个算式。相邻的符号(操作数或运算符)用1个空格隔开。

输出格式:

在一行中输出计算结果。

限制:

2≤算式中操作数的总数≤100
1≤算式中运算符的总数≤99
运算符仅包括“+”、“-”、“*”,操作数、计算过程中的值以及最终的计算结果均在int范围内。

输入样例1:

4 3 + 2 -

输出样例1:

5

输入样例2:

1 2 + 3 4 - *

输出样例2:

-3
#include<iostream>
#include<stack>
#include<cstdlib>
using namespace std;
int main()
{
	stack<int>S;
	char s[100];
	int a,b;
	while(~scanf("%s",s))
	{
			
		if(s[0]=='+')
		{
			a=S.top();
			S.pop();
			b=S.top();
			S.pop();
			S.push(a+b);
		}
		else if(s[0]=='-')
		{
			a=S.top();
			S.pop();
			b=S.top();
			S.pop();
			S.push(b-a);
		}
		else if(s[0]=='*')
		{
			a=S.top();
			S.pop();
			b=S.top();
			S.pop();
			S.push(a*b);
		}
		else
		{
			a=atoi(s);
			S.push(a);
		}
	}
	printf("%d",S.top());
	
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值