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 }

posted on 2012-08-03 07:55  mycapple  阅读(307)  评论(0)    收藏  举报

导航