算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。
输入格式:
输入在一行内给出不超过30个字符的前缀表达式,只包含+、-、*、/以及运算数,不同对象(运算数、运算符号)之间以空格分隔。
输出格式:
输出前缀表达式的运算结果,保留小数点后1位,或错误信息ERROR。
输入样例:
+ + 2 * 3 - 7 4 / 8 4
输出样例:
13.0
思路:学过数据结构的应该都知道前缀表达式是什么,也知道应该使用栈去解题,我们也可以用数组模拟栈,这样更加的方便。
我们首先利用一个string数组s把所有的这些表达式都读进来,把top初始化为0,top表示这个数组即将要入栈的元素的位置,然后在设置另外一个栈数组,把s数组的元素出栈,如果是数字就压进另一个栈数组里,如果不是数字,那么我们就从另一个数组弹出两个数字,把这两个数字进行对应的操作( + - * /)
isdigit(),判断一个字符是否是一个数字(头文件#include<ctype.h>)
代码:
#include<bits/stdc++.h>
using namespace std;
string s[110];
int top=0,top1=0;
double y[110];
int main()
{
string x;//可能是不止一位数的整数,所以要用string
while(cin>>x)
s[top++]=x;
while(top>0)
{
x=s[--top];
if(isdigit(x[x.size()-1]))
{
double k=atof(x.c_str());
y[top1++]=k;
}
else
{
if(top1<2) break;
double c=y[--top1],d=y[--top1]; //否则执行到这里就是数据库里两个不小于两个数字
if(x[0]=='+') y[top1++]=c+d;
if(x[0]=='-') y[top1++]=c-d;
if(x[0]=='*') y[top1++]=c*d;
if(x[0]=='/')
{
if(d==0)
{
top++;
break;
}
y[top1++]=c*1.0/d;
}
}
}
if(top>0||top1>1)
printf("ERROR\n");
else
printf("%.1f\n",y[--top1]);
return 0;
}