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 }

 

你可能感兴趣的:(OJ)