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 }

你可能感兴趣的:(OJ)