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