1 条题解

  • 0
    @ 2026-1-28 10:30:59
    #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
    上传者