NYOJ 128 前缀式计算
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #define N 501 5 char a[N]; 6 double fun() 7 { 8 int len; 9 char ch[10]; 10 sscanf(a,"%s",ch);//以字符串读入到ch 11 len=strlen(ch); 12 strcpy(a,a+len); 13 switch(ch[0]) 14 { 15 case '+': return fun()+fun(); 16 case '-': return fun()-fun(); 17 case '*': return fun()*fun(); 18 case '/': return fun()/fun(); 19 default : return (double)(ch);//把字符串转换成浮点数 20 } 21 } 22 int main() 23 { 24 double m; 25 while(gets(a)) 26 { 27 m=fun(); 28 printf("%.2lf\n",m); 29 } 30 system("pause"); 31 return 0; 32 }
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #define N 1100 5 char s[N]; 6 //数字栈的操作 7 typedef struct 8 { 9 float *base; 10 float *top; 11 }SqStack2; 12 int InitStack2(SqStack2 &S) 13 { 14 S.base=(float *)malloc(505*sizeof(float)); 15 S.top=S.base; 16 return 1; 17 } 18 int StackEmpty2(SqStack2 &S) 19 { 20 if(S.top==S.base) 21 return 1; 22 else return -1; 23 } 24 float GetTop2(SqStack2 S) 25 { 26 float e; 27 if(S.top==S.base) return 0; 28 e=*(S.top-1); 29 return e; 30 } 31 int Push2(SqStack2 &S,float e) 32 { 33 *S.top++=e; 34 return 1; 35 } 36 int Pop2(SqStack2 &S,float &e) 37 { 38 if(S.top==S.base) return 0; 39 e=*--S.top; 40 return 1; 41 } 42 //转化的操作过程 43 float Operate(float a,char theta,float b) 44 { 45 switch(theta){ 46 case '+': return a+b; 47 case '-': return a-b; 48 case '*': return a*b; 49 case '/': return a/b; 50 default: return 0; 51 } 52 } 53 int level(char c) 54 { 55 switch(c){ 56 case ' ': return 1; 57 case '+': 58 case '-': return 3; 59 case '*': 60 case '/': return 4; 61 default : return 0; 62 } 63 } 64 float EvaluateExpression() 65 { 66 SqStack2 OPND; 67 InitStack2(OPND); 68 bool flag; 69 float k,t; 70 char *p=s+strlen(s)-1; 71 char c=*p; 72 while(p!=s){ 73 flag=0; 74 if(!level(c)){ 75 k=c-'0'; 76 c=*--p; 77 flag=1; 78 } 79 if(c!=' '){ 80 for(t=k;*p<='9'&&*p>='0';p--) 81 t=0.1*t+*p-'0'; 82 t*=0.1; 83 c=*--p; 84 k=c-'0'; 85 Push2(OPND,k+t); 86 p--; 87 } 88 else if(flag) Push2(OPND,k); 89 if(p>s) c=*--p; 90 while(level(c)==3||level(c)==4){ 91 Pop2(OPND,k); 92 Pop2(OPND,t); 93 Push2(OPND,Operate(k,c,t)); 94 if(p<=s) break; 95 c=*--p; 96 } 97 } 98 return GetTop2(OPND); 99 } 100 //主函数 101 int main() 102 { 103 while(gets(s)){ 104 printf("%.2f\n",EvaluateExpression()); 105 } 106 return 0; 107 } 108