1 条题解

  • 0
    @ 2024-4-9 14:34:22
    #include <bits/stdc++.h>
    #define objl '\n'
    typedef long long ll;
    using namespace std;
    //数据结构在这里定义 
    int mod = 10000;
    stack<ll> num_st;//数字栈
    stack<char> char_st;//符号栈 
    string s;
    //保存不同符号的优先级 
    map<char, int> mp = {{'+',1},{'-',1},{'*',2},{'/',2}};
    
    int solve(){
    //cin cout在这里 
    	cin >> s;
    	//记录下一个数字的信息 
    	ll tmp = 0;
    	bool flag = false;
    	for(int i = 0; i < s.size();i++){
    		if(s[i] >= '0'&& s[i] <= '9'){
    			tmp = tmp * 10 + s[i] - '0';
    			flag = true;
    		}else{//处理符号
    			//先把符号前面的数字入栈 
    			if(flag == true){
    				num_st.push(tmp);
    				tmp = 0;
    				flag = false;
    			} 
    			//如果符号栈内还有符号,先把优先级大于本符号的先弹栈运算 
    			while(!char_st.empty() && mp[s[i]] < mp[char_st.top()]){
    				char c = char_st.top(); char_st.pop();
    				//如果一个符号没有对应两个操作数表达式有误 
    				if(num_st.size()<2) return -1;
    				ll right = num_st.top(); num_st.pop();
    				ll left = num_st.top(); num_st.pop();
    				ll res;
    				if(c=='+'){
    					res = (left % mod + right % mod) % mod;
    				}else if(c=='*'){
    					res = (left % mod * right % mod) % mod;
    				}
    				num_st.push(res);
    			}
    			//处理完优先级更高的运算把本符号入栈
    			char_st.push(s[i]); 
    		}
    	}
    	//把最后一个数字入栈 
    	if(flag == true) num_st.push(tmp);
    	//处理符号栈剩余字符,从右往左计算同优先级的表达式 
    	while(!char_st.empty()){
    		char c = char_st.top(); char_st.pop();
    		if(num_st.size()<2) return -1;
    		ll right = num_st.top(); num_st.pop();
    		ll left = num_st.top(); num_st.pop();
    		ll res;
    		if(c=='+'){
    			res = (left % mod + right % mod) % mod;
    		}else if(c=='*'){
    			res = (left % mod * right % mod) % mod;
    		}
    		num_st.push(res);	
    	} 
    	//正确的表达式 符号栈为空 数字栈只剩下一个结果 
    	if(num_st.size()==1&&char_st.empty()) return num_st.top() % mod;
    	else return -1;
    }
    
    int main(){
    	ios::sync_with_stdio(0);
    	cin.tie(0);
    	cout.tie(0);
    	int t;//多组数据要cin
    	//cin >> t;
    	t = 1;
    	while(t--){
    		int res = solve();
    		cout <<  res << endl;
    	} 
    	return 0;//必须加return 0 
    }
    
    • 1

    信息

    ID
    107
    时间
    1000ms
    内存
    256MiB
    难度
    5
    标签
    递交数
    81
    已通过
    30
    上传者