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 }

posted on 2012-08-12 16:57  mycapple  阅读(199)  评论(0编辑  收藏  举报

导航