1 条题解
-
0
#include<bits/stdc++.h> using namespace std; // [1] arr数组-存储输入的前缀表达式的每个token(运算符或操作数),最大支持10000个token string arr[10000]; // [2] f函数:将字符串形式的数字(支持整数/小数)转换为double类型 // 参数说明:q-输入的数字字符串(如"3"、"5.1") double f(string q){ // [3] v-记录小数点的位置,初始化为字符串末尾(默认是整数) int v=q.size()-1; // [4] 遍历字符串,寻找小数点的位置 for(int i=0;i<q.size();i++){ if(q[i]=='.'){ v=i; break; } } // [5] 情况1:字符串是整数(无小数点) if(v==q.size()-1){ double sum=0,z=1; // [6] 从右到左遍历整数部分,计算数值(个位、十位、百位...) for(int i=v;i>=0;i--){ sum+=(q[i]-'0')*z; z*=10; } return sum; // [7] 情况2:字符串是小数(有小数点) }else{ double sum=0,z=1; // [8] 计算小数点左边的整数部分(从右到左) for(int i=v-1;i>=0;i--){ sum+=(q[i]-'0')*z; z*=10; } // [9] 计算小数点右边的小数部分(从左到右,单位是0.1、0.01...) z=0.1; for(int i=v+1;i<q.size();i++){ sum+=(q[i]-'0')*z; z*=0.1; } return sum; } } int main() { // [10] s-临时存储每个输入的token(运算符/操作数) string s; // [11] x-记录输入的token总数,初始化为0 int x=0; // [12] 读取输入:按空格分割前缀表达式,每个token存入arr数组 while(cin>>s){ arr[x++]=s; } // [13] v-计算栈,存储double类型的操作数和中间结果 stack<double> v; // [14] 逆序遍历前缀表达式的token(前缀表达式的计算规则:逆序遍历,数字压栈,运算符弹出两个操作数计算) for(int i=x-1;i>=0;i--){ // [15] 情况1:当前token是数字(以0-9开头),转换为double后压栈 if(arr[i][0]>='0' && arr[i][0]<='9'){ v.push(f(arr[i])); // [16] 情况2:当前token是加法运算符'+' }else if(arr[i]=="+"){ double a=v.top();v.pop(); double b=v.top();v.pop(); v.push(b+a); // [17] 情况3:当前token是减法运算符'-'(注意前缀表达式逆序后,操作数顺序是a-b,对应原表达式的b-a) }else if(arr[i]=="-"){ double a=v.top();v.pop(); double b=v.top();v.pop(); v.push(a-b); // [18] 情况4:当前token是乘法运算符'*' }else if(arr[i]=="*"){ double a=v.top();v.pop(); double b=v.top();v.pop(); v.push(b*a); // [19] 情况5:当前token是除法运算符'/'(逆序后是a/b,对应原表达式的b/a) } else if(arr[i]=="/"){ double a=v.top();v.pop(); double b=v.top();v.pop(); v.push(a/b); } } // [20] 输出计算结果,保留两位小数 printf("%.2f",v.top()); return 0; }
- 1
信息
- ID
- 1259
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者