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