• 结题报告


    题目:点此

    思路:{

      先读入,再循环{

        如果是空格{

          如果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 ";
      if(a[i]==' '){
       if(index!=0){
        if(flot){
         index/=ksm_10(w);
         flot=false;
         w=0;
        }
        data.push(index);
       // cout << index << " ";
        index=0;
        symbol.top().times++;
        if(symbol.top().times==2){
         math();
        }
       }
       continue;
      }
     // cout << i+1 << " not space ";
      if(a[i]=='+'||a[i]=='-'||a[i]=='/'||a[i]=='*'){
       ci g;
       g.index=a[i];
       g.times=0;
       symbol.push(g);
     //  cout << "ok ";
       continue;
      }
      //cout << i << " not symbol ";
      if(a[i]=='.'){
       flot=true;
       continue;
      }
     // cout << i << " not dot ";
      if(flot){
       w++;
      }
      index*=10;
      index+=a[i]-'0';
     }
     printf("%lf",data.top());
     return 0;
    }
  • 相关阅读:
    redis之Scan
    redis之GeoHash
    redis之漏斗限流
    redis之布隆过滤器
    redis之HyperLogLog
    redis位图
    redis延迟队列
    redis分布式锁
    如何安装redis
    社区首款 OAM 可视化平台发布!关注点分离、用户友好、上手难度低
  • 原文地址:https://www.cnblogs.com/eason66-blog/p/p1096-openjudge.html
Copyright © 2020-2023  润新知