题目:点此
题目大意
计算前缀表达式
思路
先读入,再循环
如果是空格
如果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
计算;
还有一种更好的思路:
可以用一个栈S2来实现计算,扫描从右往左进行,
如果扫描到操作数,则压进S2,如果扫描到操作符,则从S2弹出两个操作数进行相应的操作,并将结果压进S2(S2的个数出2个进1个),
当扫描结束后,S2的栈顶就是表达式结果。
犯的错误
1.应该用getline(cin,a)读入字符串,我用了cin。
2.type要存一个小数,类型应该是float。
3.快速幂没有写边界条件。
收获
1.注意精度。
2.cin只读到空格、tab、回车处,读一行要用getline。
3.注意整数除以整数,结果还是整数。存小数要用浮点数。
1 #include <iostream> 2 #include <stack> 3 #include <cstdio> 4 using namespace std; 5 struct ci{ 6 char index; 7 int times; 8 }; 9 stack <double> data; 10 stack <ci> symbol; 11 void math(){ 12 double b=data.top(); 13 data.pop(); 14 double a=data.top(); 15 data.pop(); 16 double index; 17 switch(symbol.top().index){ 18 case '+':index=a+b;break; 19 case '-':index=a-b;break; 20 case '/':index=a/b;break; 21 case '*':index=a*b;break; 22 } 23 data.push(index); 24 symbol.pop(); 25 if(!symbol.empty()){ 26 symbol.top().times++; 27 if(symbol.top().times==2){ 28 math(); 29 } 30 } 31 } 32 int ksm_10(int r){ 33 if(r==0){ 34 return 1; 35 } 36 int index=1; 37 if(r%2!=0){ 38 index*=10; 39 } 40 int type=ksm_10(r/2); 41 index*=(type*type); 42 return index; 43 } 44 int main(){ 45 string a; 46 getline(cin,a); 47 bool flot=false; 48 int w=0; 49 double index=0; 50 a.push_back(' '); 51 for(int i=0;i<a.length();i++){ 52 // cout << i << " ok\n"; 53 if(a[i]==' '){ 54 if(index!=0){ 55 if(flot){ 56 index/=ksm_10(w); 57 flot=false; 58 w=0; 59 } 60 data.push(index); 61 // cout << index << "\n"; 62 index=0; 63 symbol.top().times++; 64 if(symbol.top().times==2){ 65 math(); 66 } 67 } 68 continue; 69 } 70 // cout << i+1 << " not space\n"; 71 if(a[i]=='+'||a[i]=='-'||a[i]=='/'||a[i]=='*'){ 72 ci g; 73 g.index=a[i]; 74 g.times=0; 75 symbol.push(g); 76 // cout << "ok\n"; 77 continue; 78 } 79 //cout << i << " not symbol\n"; 80 if(a[i]=='.'){ 81 flot=true; 82 continue; 83 } 84 // cout << i << " not dot\n"; 85 if(flot){ 86 w++; 87 } 88 index*=10; 89 index+=a[i]-'0'; 90 } 91 printf("%lf",data.top()); 92 return 0; 93 }