NYOJ 35 表达式求值

  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_r()

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)  //之前的提交错在这里,t应在这里清0,防止上次数据被多读

130           k=10*k+c-'0';

131           if(c=='.')

132           {

133             while(!level(*++p,1)); c=*p;

134             for(p1=p-1;*p1!='.';p1--)   //原先我把t放在这个for()语句中,导致出错!

135             t=0.1*t+*p1-'0';

136             t*=0.1;

137           }

138           Push2(OPND,k+t);  //应为这里是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_r());

162  }

163  return 0;

164 }

你可能感兴趣的:(表达式)