5-21 求前缀表达式的值(25分)
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4
的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4
。请设计程序计算前缀表达式的结果值。
输入在一行内给出不超过30个字符的前缀表达式,只包含+
、-
、*
、\
以及运算数,不同对象(运算数、运算符号)之间以空格分隔。
输出前缀表达式的运算结果,保留小数点后1位,或错误信息ERROR
。
+ + 2 * 3 - 7 4 / 8 4
13.0
用前缀表达式求值的思路还是非常清楚的,很快就写完了,找了几个数据测试也都通过了,但是在浙大的平台上提交一个数据点都没有通过,膝盖都要跪烂掉了。。。。。望大神指正。。。
我过段时间再回头看看这道题目吧。。
代码:
1 #include<iostream> 2 #include<string.h> 3 #include<stdio.h> 4 #include<stdlib.h> 5 using namespace std; 6 #define ERROR 0 7 #define OK 1 8 #define OVERFLOW -2 9 #define TRUE 1 10 #define FALSE 0 11 typedef struct Node *ptr; 12 typedef struct Node{ 13 int *base;//头指针 14 int *top;//尾指针 15 int stacksize;//最大容量 16 }Sqstack; 17 18 int InitStack(Sqstack &S) //此处是构造一个空栈 19 { 20 S.base = (int *)malloc(100 *sizeof(int)); 21 if (!S.base) exit(OVERFLOW); 22 S.top = S.base; 23 S.stacksize = 100; 24 return OK; 25 } 26 float Push(Sqstack &S,float e)//入栈操作 27 { 28 if(S.top-S.base>=S.stacksize) 29 { 30 S.base=(int *)realloc(S.base,(S.stacksize+10)*sizeof(int)); 31 if(!S.base) exit(OVERFLOW); 32 S.top=S.base+S.stacksize; 33 S.stacksize+=10; 34 } 35 *S.top++=e; 36 return OK; 37 } 38 float GetTop(Sqstack S,float &e)//返回头顶指针 39 { 40 if(S.top==S.base) 41 return ERROR; 42 else 43 return e=*(S.top-1); 44 } 45 46 float Pop(Sqstack &S,float &e) 47 { 48 if(S.top==S.base) 49 return ERROR; 50 else 51 return e=*--S.top; 52 } 53 54 float before(char A[],int len) 55 { 56 int i;float x1,x2,temp=1; 57 float e; 58 Sqstack bds; 59 InitStack(bds); 60 for(i=len-1;i>=0;i--) 61 { 62 if(‘0‘<=A[i]&&A[i]<=‘9‘) 63 Push(bds,A[i]-‘0‘); 64 else { 65 Pop(bds,x2); 66 Pop(bds,x1); 67 switch(A[i]) 68 { 69 case ‘+‘:temp=x1+x2;break; 70 case ‘-‘:temp=x2-x1;break; 71 case ‘*‘:temp=x1*x2;break; 72 case ‘/‘:{ 73 if(x1==0) 74 { 75 cout<<ERROR<<endl; 76 return ERROR;} 77 else 78 { temp=x2/x1;break;} 79 } 80 } 81 Push(bds,temp); 82 } 83 } 84 GetTop(bds,e); 85 return e; 86 } 87 88 int main() 89 { 90 char pre[30];int len; 91 float e; 92 scanf("%s",pre);//输入前缀表达式 93 len=(int)strlen(pre); 94 e=before(pre,len);//输出前缀表达式的计算值 95 printf("%.1f\n",e); 96 return 0; 97 }
原文:http://www.cnblogs.com/guohaoyu110/p/6358663.html