NYOJ 267 郁闷的C小加(二)

http://acm.nyist.net/JudgeOnline/problem.php?pid=267

好烦....

View Code
  1 #include <stdio.h>
  2 #include <string.h>
  3 #define maxn 1005
  4 char stack[maxn],str[maxn],source[maxn],aim[maxn][10];
  5 double num[maxn],s[maxn];
  6 int main()
  7 {
  8     int i,j,l,k,t,le,rear,f=0,mark,iter;
  9     double a,b,c;
 10     scanf("%d",&t);
 11     while(t--)
 12     {
 13         if(f) printf("\n");
 14         f=1;
 15         scanf("%s",str);
 16         le=strlen(str);
 17         rear=-1;
 18         l=0;
 19         j=0;
 20         mark=0;
 21         iter=0;
 22         for(i=0;i<maxn;i++)
 23         {
 24             s[i]=0;
 25             num[i]=0;
 26         }
 27         for(i=0;i<le;i++)
 28         {
 29             if(str[i]==')')
 30             {
 31                 while(stack[rear]!='(')
 32                 {
 33                     source[l]=stack[rear];
 34                     l++;
 35                     rear--;
 36                 }
 37                 rear--;
 38             }
 39             else if(str[i]=='.' || ('0'<=str[i] && str[i]<='9'))
 40             {
 41                 source[l]='_';
 42                 aim[j][iter++]=str[i];
 43                 if(str[i]=='.')
 44                 {
 45                     mark=1;
 46                     c=0.1;
 47                     continue;
 48                 }
 49                 if(!mark)num[j]=num[j]*10+(str[i]-'0');
 50                 else
 51                 {
 52                     num[j]=num[j]+(str[i]-'0')*c;
 53                     c/=10;
 54                 } 
 55                 if(str[i+1]!='.' && ('0'>str[i+1] || str[i+1]>'9'))
 56                 {
 57                     j++;
 58                     l++;
 59                     aim[j][iter]='\0';
 60                     iter=0;
 61                     mark=0;
 62                 }
 63             }
 64             else if(str[i]=='(')
 65             {
 66                 stack[++rear]=str[i];
 67             }
 68             else if(str[i]=='/' || str[i]=='*')
 69             {
 70                 while(stack[rear]=='/' || stack[rear]=='*')
 71                 {
 72                     source[l]=stack[rear];
 73                     l++;
 74                     rear--;
 75                 }
 76                 stack[++rear]=str[i];
 77             }
 78             else
 79             {
 80                 while(rear>=0 && stack[rear]!='(')
 81                 {
 82                     source[l]=stack[rear];
 83                     l++;
 84                     rear--;
 85                 }
 86                 stack[++rear]=str[i];
 87             }
 88         }
 89         while(rear>=0)
 90         {
 91             source[l]=stack[rear];
 92             l++;
 93             rear--;
 94         }
 95         k=-1;
 96         j=-1;
 97         for(i=0;i<l-1;i++)
 98         {
 99             if(source[i]=='_')
100             {
101                 ++k;
102                 ++j;
103                 printf("%s",aim[j]);
104                 s[k]=num[j];
105             } 
106             else if(source[i]=='+')
107             {
108                 b=s[k];
109                 a=s[k-1];
110                 k-=1;
111                 s[k]=a+b;
112             }
113             else if(source[i]=='-')
114             {
115                 b=s[k];
116                 a=s[k-1];
117                 k-=1;
118                 s[k]=a-b;
119             }
120             else if(source[i]=='*')
121             {
122                 b=s[k];
123                 a=s[k-1];
124                 k-=1;
125                 s[k]=a*b;
126             }
127             else
128             {
129                 b=s[k];
130                 a=s[k-1];
131                 k-=1;
132                 s[k]=a/b;
133             }
134             if(source[i]!='_')printf("%c",source[i]);
135         }
136         printf("%c\n",source[i]);
137         printf("%.2lf\n",s[0]);
138     }
139     return 0;
140 }
原文地址:https://www.cnblogs.com/yoru/p/2672530.html