题目:点此

题目大意

计算前缀表达式

思路

  先读入,再循环

    如果是空格

      如果index≠0(空格前一个字符是数字)

        如果这个数字是浮点数(flot=true)

          index除以10w*,

          w清零,flot重置。
        

      index入data栈,index清零。

      前一个操作符的操作数个数++;

      如果个数=2

        计算;计算方法点此

      

    

    如果是运算符

      入symbol栈,此操作符的操作数赋为0;

    

    如果是小数点

      flot赋为true;

    

    如果flot是true

      小数位数(w)++;

    

    index乘十加此数。

  

  输出data栈栈顶。

 

计算方法

  将b赋为data栈栈顶,data栈出栈。

  将a赋为data栈新的栈顶,data栈出栈。

  取出symbol栈栈顶运算符,将a和b作为操作数计算,将结果压入data栈中。

  如果symbol栈不空

    栈顶操作数个数++;

    如果操作数个数为2

      计算;

    

 

还有一种更好的思路:

 

  可以用一个栈S2来实现计算,扫描从右往左进行,

 

  如果扫描到操作数,则压进S2,如果扫描到操作符,则从S2弹出两个操作数进行相应的操作,并将结果压进S2(S2的个数出2个进1个),

 

  当扫描结束后,S2的栈顶就是表达式结果。

  

 

犯的错误

   1.应该用getline(cin,a)读入字符串,我用了cin。

  2.type要存一个小数,类型应该是float。

  3.快速幂没有写边界条件。

 

收获

  1.注意精度。

  2.cin只读到空格、tab、回车处,读一行要用getline。

  3.注意整数除以整数,结果还是整数。存小数要用浮点数。

 

 

 1 #include <iostream>
 2 #include <stack>
 3 #include <cstdio>
 4 using namespace std;
 5 struct ci{
 6  char index;
 7  int times;
 8 };
 9 stack <double> data;
10 stack <ci> symbol;
11 void math(){
12  double b=data.top();
13  data.pop();
14  double a=data.top();
15  data.pop();
16  double index;
17  switch(symbol.top().index){
18   case '+':index=a+b;break;
19   case '-':index=a-b;break;
20   case '/':index=a/b;break;
21   case '*':index=a*b;break;
22  }
23  data.push(index);
24  symbol.pop();
25  if(!symbol.empty()){
26   symbol.top().times++;
27   if(symbol.top().times==2){
28    math();
29   }
30  }
31 }
32 int ksm_10(int r){
33  if(r==0){
34   return 1;
35  }
36  int index=1;
37  if(r%2!=0){
38   index*=10;
39  }
40  int type=ksm_10(r/2);
41  index*=(type*type);
42  return index;
43 }
44 int main(){
45  string a;
46  getline(cin,a);
47  bool flot=false;
48  int w=0;
49  double index=0;
50  a.push_back(' ');
51  for(int i=0;i<a.length();i++){
52  // cout << i << " ok\n";
53   if(a[i]==' '){
54    if(index!=0){
55     if(flot){
56      index/=ksm_10(w);
57      flot=false;
58      w=0;
59     }
60     data.push(index);
61    // cout << index << "\n";
62     index=0;
63     symbol.top().times++;
64     if(symbol.top().times==2){
65      math();
66     }
67    }
68    continue;
69   }
70  // cout << i+1 << " not space\n";
71   if(a[i]=='+'||a[i]=='-'||a[i]=='/'||a[i]=='*'){
72    ci g;
73    g.index=a[i];
74    g.times=0;
75    symbol.push(g);
76  //  cout << "ok\n";
77    continue;
78   }
79   //cout << i << " not symbol\n";
80   if(a[i]=='.'){
81    flot=true;
82    continue;
83   }
84  // cout << i << " not dot\n";
85   if(flot){
86    w++;
87   }
88   index*=10;
89   index+=a[i]-'0';
90  }
91  printf("%lf",data.top());
92  return 0;
93 }

 

posted on 2020-01-04 17:07  eason66  阅读(281)  评论(0编辑  收藏  举报