题目:点此

思路:{

  先读入,再循环{

    如果是空格{

      如果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.注意整数除以整数,结果还是整数。存小数要用浮点数。

 

}

 

#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==1){
        return 10;
    }
    if(r==2){
        return 10*10;
    }
    if(r==3){
        return 10*10*10;
    }
    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;
}

版权声明:本文为eason66-blog原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/eason66-blog/p/p1096-openjudge.html