栈与队列应用:计算前缀表达式的值
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如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; }