HDU 1237 简单计算器 栈

http://acm.hdu.edu.cn/showproblem.php?pid=1237

题意:

  给你一个只有+ - * / 的计算表达式 , 要你求出结果.

 

坑爹:

  一开始我只是以为只要在输入的时候遇到*或者/就弹出来进行计算,然后在到最后计算 + 和  - 的时候直接弹出

一个一个计算,最后才发现原来在最后弹出来计算的时候要全部反过来,不能直接弹出就计算然后压入.

 

解法:

  遇到 * 或者 / 就弹出两个进行计算, 然后压入结果 , 到最后的时候把栈里的数字反过来,也就是用一个数组从0 -  n

开始存每一个出栈的数字 , 符号栈也是相同的操作 , 然后就可以进行正常的按顺序这样做 + 和 - 操作了.

 

View Code
  1 #include<iostream>
  2 #include<stack>
  3 using namespace std;
  4 
  5 
  6 int main()
  7 {
  8     char ex[300];
  9     while(scanf("%s",ex) != EOF)
 10     {
 11         double num;
 12         char str;
 13         stack <double> N;
 14         stack <char> C;
 15         
 16         int flag = 0; int len;
 17         len = strlen(ex) ;
 18         
 19         for(int y = 0 ; y < len ; y ++)
 20         {
 21             if(ex[0] != '0')
 22             {
 23                 flag = 1;
 24                 break;
 25             }
 26         }
 27         if(!flag)
 28         {
 29             if(getchar() == '\n')
 30             {
 31                 break;
 32             }
 33         }
 34         
 35         
 36         
 37         
 38         num = ex[ len - 1 ] - 48;
 39         
 40         for( y = len - 2 ; y >=  0 ; y -- )
 41         {
 42             double a = ex[y] - 48 ;
 43             for(int k = 0 ; k < len - y - 1 ; k++ )
 44             {
 45                 a *= 10 ;
 46             }
 47             num += a;
 48         }
 49         
 50         N.push(num);
 51         
 52         
 53         
 54         for (int i = 1;  ; i++  )
 55         {
 56             
 57             cin>>str ;
 58             cin>>num ;
 59             N.push(num);
 60             
 61             
 62             
 63             if(str == '/' )
 64             {
 65                 double a;
 66                 double b;
 67                 a = N.top();
 68                 N.pop();
 69                 b = N.top();
 70                 N.pop();
 71                 N.push( b / a );
 72             }
 73             
 74             if(str == '*' )
 75             {
 76                 double a;
 77                 double b;
 78                 a = N.top();
 79                 N.pop();
 80                 b = N.top();
 81                 N.pop();
 82                 N.push( b * a );
 83             }
 84             
 85             if(str == '-' || str == '+')
 86             {
 87                 C.push(str);
 88             }
 89             
 90             
 91             
 92             if( getchar()  == '\n')
 93             {
 94                 break;
 95             }
 96         }
 97 
 98         if(C.size() != 0)
 99         {
100             double st[300];
101             char sd[300];
102             int count;
103             for(i = 0 ; N.size() != 0 ; i ++)
104             {
105                 st[i] = N.top();
106                 N.pop();
107             }
108             for(i = 0 ; C.size() != 0 ; i++ )
109             {
110                 sd[i] = C.top();
111                 C.pop();
112             }
113             sd[i] = '\0' ;
114             
115             int  len1;
116             len1 = strlen(sd);
117             char *p = sd + len1 - 1;
118             
119             for(i = len1 ; i >0 ; i -- )
120             {
121                 if(*p == '+' )
122                 {
123                     st[i-1] = st[i-1] + st[i];
124                 }
125                 if(*p == '-' )
126                 {
127                     st[i -1 ]  = st[i] - st[i-1];
128                 }
129                 p--;
130             }
131             
132             printf("%.2lf\n",st[0]);    
133         }
134         else
135         {
136             printf("%.2lf\n",N.top());
137         }
138         
139     }
140     return 0;
141 }

 

posted @ 2012-09-15 17:37  pc....  阅读(278)  评论(0)    收藏  举报