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