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