nyoj128 前缀式计算
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #define N 1010 5 char s[N]; 6 //数字栈的操作 7 typedef struct 8 { 9 float *base; 10 float *top; 11 }SqStack; 12 int InitStack(SqStack &S) 13 { 14 S.base=(float *)malloc(N/2*sizeof(float)); 15 S.top=S.base; 16 return 1; 17 } 18 float GetTop(SqStack S) 19 { 20 float e; 21 if(S.top==S.base) return 0; 22 e=*(S.top-1); 23 return e; 24 } 25 int Push(SqStack &S,float e) 26 { 27 *S.top++=e; 28 return 1; 29 } 30 int Pop(SqStack &S,float &e) 31 { 32 if(S.top==S.base) return 0; 33 e=*--S.top; 34 return 1; 35 } 36 //转化的操作过程 37 float Operate(float a,char theta,float b) 38 { 39 switch(theta){ 40 case '+': return a+b; 41 case '-': return a-b; 42 case '*': return a*b; 43 case '/': return a/b; 44 default: return 0; 45 } 46 } 47 int level(char c) 48 { 49 switch(c){ 50 case ' ': return 1; 51 case '+': 52 case '-': return 3; 53 case '*': 54 case '/': return 4; 55 default : return 0; 56 } 57 } 58 float EvaluateExpression() 59 { 60 SqStack OPND; 61 InitStack(OPND); 62 bool flag; 63 float k,t; 64 char *p=s+strlen(s)-1; 65 char c=*p; 66 while(p!=s){ 67 flag=0; 68 if(!level(c)){ 69 k=c-'0'; 70 c=*--p; 71 flag=1; 72 } 73 if(c!=' '){ 74 for(t=k;*p!='.';p--) 75 t=0.1*t+*p-'0'; 76 t*=0.1; 77 c=*--p; 78 k=c-'0'; 79 Push(OPND,k+t); 80 p--; 81 } 82 else if(flag) Push(OPND,k); 83 c=*--p; 84 while(level(c)==3||level(c)==4){ 85 Pop(OPND,k); 86 Pop(OPND,t); 87 Push(OPND,Operate(k,c,t)); 88 if(p==s) break; 89 c=*--p; 90 } 91 } 92 return GetTop(OPND); 93 } 94 //主函数 95 int main() 96 { 97 while(gets(s)) 98 printf("%.2f\n",EvaluateExpression()); 99 return 0; 100 }
本题我利用了前缀式倒过来恰好是后缀式的形式,然后就可用一个数字栈进行处理了,但把字符串倒置过来的同时,数字特别是小数也倒置过来了,所以我把时间花在了处理一个颠倒数字上!!