结题报告

2020-01-04 16:01:20来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

结题报告

题目:点此

思路:{

  先读入,再循环{

    如果是空格{

      如果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{

      计算;

    }

  }

}

犯的错误{

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

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

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

}

收获{

  1.注意精度。

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

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

 

}

还有一种更好的思路:{

  可以用一个栈S2来实现计算,扫描从右往左进行,   如果扫描到操作数,则压进S2,如果扫描到操作符,则从S2弹出两个操作数进行相应的操作,并将结果压进S2(S2的个数出2个进1个),   当扫描结束后,S2的栈顶就是表达式结果。 } #include <iostream>
#include <stack>
#include <cstdio>
using namespace std;
struct ci{
 char index;
 int times;
};
stack <double> data;
stack <ci> symbol;
void math(){
 double b=data.top();
 data.pop();
 double a=data.top();
 data.pop();
 double index;
 switch(symbol.top().index){
  case '+':index=a+b;break;
  case '-':index=a-b;break;
  case '/':index=a/b;break;
  case '*':index=a*b;break;
 }
 data.push(index);
 symbol.pop();
 if(!symbol.empty()){
  symbol.top().times++;
  if(symbol.top().times==2){
   math();
  }
 }
}
int ksm_10(int r){
 if(r==0){
  return 1;
 }  int index=1;
 if(r%2!=0){
  index*=10;
 }
 int type=ksm_10(r/2);
 index*=(type*type);
 return index;
} int main(){
 string a;
 getline(cin,a);
 bool flot=false;
 int w=0;
 double index=0;
 a.push_back(' ');
 for(int i=0;i<a.length();i++){
 // cout << i << " ok\n";
  if(a[i]==' '){
   if(index!=0){
    if(flot){
     index/=ksm_10(w);
     flot=false;
     w=0;
    }
    data.push(index);
   // cout << index << "\n";
    index=0;
    symbol.top().times++;
    if(symbol.top().times==2){
     math();
    }
   }
   continue;
  }
 // cout << i+1 << " not space\n";
  if(a[i]=='+'||a[i]=='-'||a[i]=='/'||a[i]=='*'){
   ci g;
   g.index=a[i];
   g.times=0;
   symbol.push(g);
 //  cout << "ok\n";
   continue;
  }
  //cout << i << " not symbol\n";
  if(a[i]=='.'){
   flot=true;
   continue;
  }
 // cout << i << " not dot\n";
  if(flot){
   w++;
  }
  index*=10;
  index+=a[i]-'0';
 }
 printf("%lf",data.top());
 return 0;
}

原文链接:https://www.cnblogs.com/eason66-blog/p/p1096-openjudge.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:C++代做,C++编程代做,C++程序代做,留学生C++ Lab代写

下一篇:float和double的区别