结题报告
题目:点此
思路:{
先读入,再循环{
如果是空格{
如果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; }