nyoj35 表达式求值
1 #include<stdio.h> 2 #include<stdlib.h> 3 #define N 1010 4 char s[N]; 5 //字符栈的操作 6 typedef struct 7 { 8 char *base; 9 char *top; 10 }SqStack1; 11 int InitStack1(SqStack1 &S) 12 { 13 S.base=(char *)malloc(N*sizeof(char)); 14 if(!S.base) exit(1); 15 S.top=S.base; 16 return 1; 17 } 18 int StackEmpty1(SqStack1 &S) 19 { 20 if(S.top==S.base) 21 return 1; 22 return 0; 23 } 24 char GetTop1(SqStack1 S) 25 { 26 char e; 27 if(S.top==S.base) return 0; 28 e=*(S.top-1); 29 return e; 30 } 31 int Push1(SqStack1 &S,char e) 32 { 33 *S.top++=e; 34 return 1; 35 } 36 int Pop1(SqStack1 &S,char &e) 37 { 38 if(S.top==S.base) return 0; 39 e=*--S.top; 40 return 1; 41 } 42 //数字栈的操作 43 typedef struct 44 { 45 float *base; 46 float *top; 47 }SqStack2; 48 int InitStack2(SqStack2 &S) 49 { 50 S.base=(float *)malloc(N*sizeof(float)); 51 if(!S.base) exit(1); 52 S.top=S.base; 53 return 1; 54 } 55 int StackEmpty2(SqStack2 &S) 56 { 57 if(S.top==S.base) 58 return 1; 59 else return -1; 60 } 61 float GetTop2(SqStack2 S) 62 { 63 float e; 64 if(S.top==S.base) return 0; 65 e=*(S.top-1); 66 return e; 67 } 68 int Push2(SqStack2 &S,float e) 69 { 70 *S.top++=e; 71 return 1; 72 } 73 int Pop2(SqStack2 &S,float &e) 74 { 75 if(S.top==S.base) return 0; 76 e=*--S.top; 77 return 1; 78 } 79 //转化的操作过程 80 float Operate(float a,char theta,float b) 81 { 82 switch(theta) 83 { 84 case '+': return a+b; 85 case '-': return a-b; 86 case '*': return a*b; 87 case '/': return a/b; 88 default: return 0; 89 } 90 } 91 int level(char c,int i) 92 { 93 switch(c) 94 { 95 case '=': return 1; 96 case ')': return i?2:5; 97 case '+': 98 case '-': return 3; 99 case '*': 100 case '/': return 4; 101 case '(': return i?5:2; 102 default : return 0; 103 } 104 } 105 char Precede(char c1,char c2) 106 { 107 int k=(c1=='('&&c2=='=')||(c1=='='&&c2==')')||(c1==')'&&c2=='('); 108 if(!k) 109 { 110 if(c1=='('&&c2==')') return '='; 111 else 112 { 113 if(level(c1,0)<level(c2,1)) return '<'; 114 else return '>'; 115 } 116 } 117 return 0; 118 } 119 float EvaluateExpression() 120 { 121 SqStack1 OPTR; SqStack2 OPND; 122 char theta,c,x; float a,b,k,t; char *p1,*p=s; 123 InitStack1(OPTR); Push1(OPTR,'='); 124 InitStack2(OPND); c=*p; 125 while(c!='='||GetTop1(OPTR)!='=') 126 { 127 if(!level(c,1)) 128 { 129 for(t=k=0;!level(c,1)&&c!='.';c=*++p) 130 k=10*k+c-'0'; 131 if(c=='.') 132 { 133 while(!level(*++p,1)); c=*p; 134 for(p1=p-1;*p1!='.';p1--) 135 t=0.1*t+*p1-'0'; 136 t*=0.1; 137 } 138 Push2(OPND,k+t); 139 } 140 else 141 switch(Precede(GetTop1(OPTR),c)) 142 { 143 case'<': Push1(OPTR,c);c=*++p;break; 144 case'=': Pop1(OPTR,x); c=*++p;break; 145 case'>': 146 Pop1(OPTR,theta); 147 Pop2(OPND,b); Pop2(OPND,a); 148 Push2(OPND,Operate(a,theta,b)); 149 } 150 } 151 return GetTop2(OPND); 152 } 153 //主函数 154 int main() 155 { 156 int n; 157 scanf("%d%*c",&n); 158 while(n--) 159 { 160 gets(s); 161 printf("%.2f\n",EvaluateExpression()); 162 } 163 return 0; 164 }