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 }

 

posted on 2012-08-02 08:37  小花熊  阅读(259)  评论(0编辑  收藏  举报

导航