1 条题解

  • 0
    @ 2026-1-28 10:39:34
    #include<bits/stdc++.h>
    using namespace std;
    
    // [1] arr数组-存储后缀表达式的每个token(数字或运算符),最大支持10000个token
    string arr[10000];
    
    // [2] f函数:将字符串形式的整数转换为int类型(支持多位数)
    // 参数说明:q-输入的数字字符串(如"14"、"20")
    int f(string q){
        // [3] j-当前位的权重(个位1、十位10、百位100...),初始为1;sum-累计数值,初始为0
    	int j=1,sum=0; 
        // [4] 从字符串末尾(个位)向开头遍历,计算整数的数值
    	for(int i=q.size()-1;i>=0;i--){
    		sum+=(q[i]-'0')*j;
    		j*=10;
    	} 
    	return sum;
    }
    
    int main() {
        // [5] s-临时存储每个输入的token(数字/运算符/@)
    	string s;
    	cin>>s;
        // [6] x-记录输入的有效token总数(排除结束符@),初始为0
    	int x=0;
        // [7] 读取输入:直到遇到结束符@,将每个token存入arr数组
    	while(s!="@"){
    		arr[x++]=s;
    		cin>>s;
    	}
        // [8] v-计算栈,存储int类型的操作数和中间结果
    	stack<int> v;
        // [9] 顺序遍历后缀表达式的每个token(后缀表达式计算规则:顺序遍历,数字压栈,运算符弹出两个操作数计算)
    	for(int i=0;i<x;i++){
            // [10] 情况1:当前token是数字(以0-9开头),转换为int后压栈
    		if(arr[i][0]>='0' && arr[i][0]<='9'){
    			v.push(f(arr[i]));
            // [11] 情况2:当前token是加法运算符'+'
    		}else if(arr[i]=="+"){
    			int a=v.top();v.pop();
    			int b=v.top();v.pop();
    			v.push(b+a);  // 后缀表达式ab+ → b+a
            // [12] 情况3:当前token是减法运算符'-'
    		}else if(arr[i]=="-"){
    			int a=v.top();v.pop();
    			int b=v.top();v.pop();
    			v.push(b-a);  // 后缀表达式ab- → b-a
            // [13] 情况4:当前token是乘法运算符'*'
    		}else if(arr[i]=="*"){
    			int a=v.top();v.pop();
    			int b=v.top();v.pop();
    			v.push(b*a);  // 后缀表达式ab* → b*a
            // [14] 情况5:当前token是除法运算符'/'(题目要求整除,使用整数除法)
    		}
    		else if(arr[i]=="/"){
    			int a=v.top();v.pop();
    			int b=v.top();v.pop();
    			v.push(b/a);  // 后缀表达式ab/ → b/a(整除)
    		}
    	} 
        // [15] 输出栈顶的最终计算结果(后缀表达式的结果存储在栈顶)
    	cout<<v.top();
        return 0;
    }
    
    • 1

    信息

    ID
    1268
    时间
    1000ms
    内存
    256MiB
    难度
    2
    标签
    递交数
    2
    已通过
    1
    上传者