干就行了

一个关于括号能否删除的很有意思的题

#include<bits/stdc++.h>
using namespace std;
int level[1000007];
int main(){
    
    
    string s;
    stack<int> stack;
    memset(level,0,sizeof(level));
    level['+']=1;
	level['-']=2;
	level['*']=3;
    level['/']=4;
    cin>>s;
    for(int i=0;i<s.length();i++){
    
    
    	int minyunsuanji=5;
        if(s[i]=='('||s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/'){
    
    //这个只存储符号和括号 
            stack.push(i);
        }
        else if(s[i]==')'){
    
    //这里证明找到了一对括号 
            while(s[stack.top()]!='('){
    
    //所以要遍历之前所有的东西(从前括号开始) 
                minyunsuanji=min(minyunsuanji,level[s[stack.top()]]);
                stack.pop();
            }
            
            //minyunsuanji的意思是当前(从前括号到后括号里面最小的运算级) 
            //after的意思是这个括号的序列里的第一个符号 
            //before指括号最后一个符号 
            
            int before=-1,after=-1;
            if(i+1<s.length()&&s[i+1]!=')'){
    
    //整个的第一个 
                after=level[s[i+1]];
        	}
            if(stack.top()-1>=0 && s[stack.top()-1]!='('){
    
    //这个区间内最后一个 
                before=level[s[stack.top()-1]];
        	}
            if(minyunsuanji>=after&&minyunsuanji>=before){
    
    //如果中间的最小的还比前面的大,不用加括号   
                s[i]=s[stack.top()]=0;
            }
            if((minyunsuanji==1&&after==2&&before<2)||(minyunsuanji==3&&after==4&& before<4)){
    
    //这个是几种不可以删除符号的情况 
                s[i]=s[stack.top()]=1;
                //比如外面是减法,里面是加法
				//还有老师强调的除法特判 
            }
        }
    }
    for(int i=0;i<s.length();i++){
    
    
    	if(s[i]==' ') continue;
    	cout<<s[i];
	} 
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45446715/article/details/121482975