算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4
的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4
。请设计程序计算前缀表达式的结果值。
输入格式:
输入在一行内给出不超过30个字符的前缀表达式,只包含+、-、*、/
以及运算数,不同对象(运算数、运算符号)之间以空格分隔。
输出格式:
输出前缀表达式的运算结果,保留小数点后1位,或错误信息ERROR
。
输入样例:
+ + 2 * 3 - 7 4 / 8 4
输出样例:
13.0
代码:
#include <stdio.h>
const int N = 40;
typedef struct node {
double num;
char op;
int flag;
}node;
typedef struct stack{
node ths;
}stack;
double js(double a, double b, char c)
{
switch (c) {
case '+' : return a + b;
case '-' : return a - b;
case '*' : return a * b;
case '/' : return a / b;
}
}
int main()
{
node a[N];
int cnt = 0;
char ch, ch1;
stack st1[N];
int top1 = 0;
while ((ch = getchar()) && ch != '\n') {
if(ch == ' ') {
continue;
}
double sum = 0;
int flag = 1;
if(ch == '-') {
flag = -1;
ch1 = ch;
ch = getchar();
}
if(ch >= '0' && ch <= '9') {
sum = ch - '0';
while ((ch = getchar()) && ch != '\n' && ch != ' ') {
if(ch >= '0' && ch <= '9') {
sum = sum * 10 + ch - '0';
}
else {
break;
}
}
double x = 0.1;
if(ch == '.') {
while ((ch = getchar()) && ch != '\n' && ch != ' ') {
if(ch >= '0' && ch <= '9') {
sum = sum + (ch - '0') * x;
x *= 0.1;
}
else {
break;
}
}
}
a[cnt].flag = 1;
a[cnt++].num = flag * sum;
}
else {
a[cnt].flag = 0;
a[cnt].op = ch;
if(flag == -1) {
a[cnt].op = ch1;
}
cnt++;
}
if(ch == '\n') {
break;
}
}
node t;
for(int i = cnt - 1; i >= 0; i--) {
if(a[i].flag == 1) {
st1[top1++].ths = a[i];
}
else {
double num1 = st1[--top1].ths.num;
double num2 = st1[--top1].ths.num;
t.flag = 1;
if(a[i].op == '/' && num2 == 0) {
printf("ERROR\n");
return 0;
}
t.num = js(num1, num2, a[i].op);
st1[top1++].ths = t;
}
}
printf("%.1f\n", st1[top1 - 1].ths.num);
// for(int i = 0; i < cnt; i++) {
// if(a[i].flag == 0) {
// printf("%c ", a[i].op);
// }
// else {
// printf("%f ", a[i].num);
// }
// }
return 0;
}