算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如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>
#include<stdlib.h>
#include<ctype.h> //isdit函数
#include<math.h> //fabs函数 求绝对值
#define MAXSIZE 100
typedef double ElemType;
typedef struct
{
ElemType *base;
ElemType *top;
int StackSize;
}sqStack;
void InitStack(sqStack *s)
{
s->base = (ElemType *)malloc(sizeof(ElemType) * MAXSIZE);
if(!s->base)
{
exit(0);
}
s->top = s->base;
s->StackSize = MAXSIZE;
}
void Push(sqStack *s, ElemType e)
{
if(s->top - s->base == s->StackSize)
{
exit(0);
}
*(s->top) = e;
s->top++;
}
void Pop(sqStack *s, ElemType *e)
{
if(s->top == s->base)
{
return;
}
*e = *--(s->top);
}
int main(void)
{
sqStack sq;
char sl[30];
char c;
double d,e;
int i,len,k;
int sum;
char str1[10]; //缓冲区
char str2[10];
int count = 0;
int tem;
int flag = 0;
InitStack(&sq); //初始化
gets(sl);
for(i=0; sl[i]; i++); //测量长度
len = i;
tem = len;
i = 1;
while(tem)
{
c = sl[len-i];
while( isdigit(c) || c=='.') //缓冲区
{
str1[count++] = c;
str1[count] = '\0';
i++;
c = sl[len-i];
tem--;
if(c == ' ' || c=='-' || c=='+')
{
for(k=0; k<count; k++) //逆序
{
str2[k] = str1[count-k-1];
}
str2[count] = '\0';
d = atof(str2); //将字符串转化为浮点型
if(c == '-') //出现+1
{
d = -d;
i++;
c = sl[len-i];
}
if(c == '+') //出现-1
{
d = +d;
i++;
c = sl[len-i];
}
Push(&sq,d);
count = 0;
str2[0] = '\0';
break;
}
}
switch(c)
{
case '+':
Pop(&sq,&e);
Pop(&sq,&d);
Push(&sq,d+e);
break;
case '-':
Pop(&sq,&e);
Pop(&sq,&d);
Push(&sq,e-d);
break;
case '*':
Pop(&sq,&e);
Pop(&sq,&d);
Push(&sq,d*e);
break;
case '/':
Pop(&sq,&e);
Pop(&sq,&d);
if(d != 0)
{
Push(&sq,e/d);
}
else
{
flag = 1;
}
break;
}
i++;
c = sl[len-i];
tem--;
}
if(flag == 0)
{
Pop(&sq,&d);
if(fabs(d-0.0)<0.0000001)
{
printf("0");
}
else
printf("%.1f",d);
}
else
{
printf("ERROR");
}
return 0;
}