1 条题解

  • 0
    @ 2023-6-11 12:22:23

    C :

    
    #include<string.h>
    void Output( char [] ) ;
    int Solve( char [] , int ) ;  
    int pd( char [] ,  int , int );
    int main(void)
    {
    	char zf[256]; 
    	gets( zf );
    	Solve( zf , 0  ); 
    	Output( zf ) ;  
    	return 0 ; 
    }
    int pd( char zf[] , int left, int right )
    {
    	int i , leftAcount ;
        if( zf[ left - 1 ] == '-')
    	{    
     
            i = left;
            leftAcount = 1;
            while( ++ i < right)
    		{
                if(zf[i] == '(') 
    			{
    				leftAcount ++;
    			}
                if(zf[i] == '+' && leftAcount == 1) 
    			{
    				return 0;
    		    } 
            }
        }
        if( zf[ left - 1 ] == '/')
    	{
    		return 0;    	
    	} 
        if(zf[ left - 1 ] != '*' && zf[ left - 1 ] != '/' && zf[ right + 1 ] != '*' && zf[ right + 1 ] != '/')
    	{
    	   return 1;
    	} 
     
     
        i = left ;
        leftAcount = 1;
        while(++i < right)
    	{
            if(zf[i] == '(') 
    		{
    			leftAcount ++;
    		}
            if(zf[i] == '*' && leftAcount == 1)
    		{
    			return 1;	
    		}  
        }
     
     
        return 0;
    }
    int Solve( char zf[]  , int i  ) 
    {
    	int left , right ; 
    	while( zf[i] != '\0')
    	{
    		if( zf[i] == ')')
    		{
    			return i ; 
    		}
    		if( zf[i] == '(')
    		{
    			left = i ; 
    			right = Solve( zf , i + 1  ) ;
    			i = right ;  
    			if( pd( zf , left , right ))
    			{
    				zf[left] = ' ' ;
    				zf[right] = ' ' ;  
    			}
    		}
    		i ++ ; 	
    	} 
    }
    void Output( char zf[] ) 
    {
    	int i = 0 ;   
    	while( zf[ i ] != '\0')
    	{
    		
            if(zf[i] != ' ')
    		{
                putchar(zf[i]);
            }
            i ++ ; 
        }
    }
    
    
    

    C++ :

    #include "iostream"
    #include "string"
    #include "stdio.h"
    #include "ctype.h"
    #include "algorithm"
    #include "stack"
    using namespace std;
    
    int cacluExprePriority(string str,bool &hasC)
    {
        int left=0;
        int right=0;
        bool bfind=false;
        for(int i=0;i<str.size();i++)
        {
            if(str[i]=='(')
                left++;
            if(str[i]==')')
                right++;
            if(str[i]=='/')
                hasC=true;
            if(str[i]=='*'||str[i]=='/')
            {
                if(left==right)
                    return 2;
            }
            if(str[i]=='+'||str[i]=='-')
            {
                bfind=true;
            }
        }
        return bfind?1:-1;
    }
    bool vis[1000];
    int safe(int i,int n)
    {
        if(i<0)
            return 0;
        if(i>=n)
            return n-1;
        return i;
    }
    void findIndexOfBrackets(string str)
    {
        stack<int>q;
        for(int i=0;i<str.size();i++)
        {
            if(str[i]=='(')
            {
                q.push(i);
            }
           if(str[i]==')')
            {
                int s=q.top();
                int t=i;
                bool hasC=false;
                 int priority=cacluExprePriority(str.substr(s+1,t-s-1),hasC);
                 q.pop();
                 bool temp=false;
                 if(s-1>=0&&cacluExprePriority(str.substr(safe(s-1,str.size()),1),temp)>=cacluExprePriority(str.substr(safe(t+1,str.size()),1),temp))
                 {
                     char op=str[s-1];
                     {
                     if(op=='+')
                     {
                        vis[s]=vis[t]=true;
                     }
                    if(op=='-')
                    {
                        if(priority==2)
                            vis[s]=vis[t]=true;
                    }
                    if(op=='*')
                    {
                        if(priority==2&&hasC==false)
                            vis[s]=vis[t]=true;
                    }
                  }
                 }
                 else  if(t+1<str.size())
    
                {
    
    
                        char op=str[t+1];
                        if(op=='+'||op=='-')
                        {
                            vis[s]=vis[t]=true;
                        }
    
                        if(op=='*'||op=='/')
                        {
                            if(priority==2)
                                vis[s]=vis[t]=true;
                        }
                }
            }
        }
    
    }
    int main()
    {
        string exper;
        cin>>exper;
    
        findIndexOfBrackets(exper);
        for(int i=0;i<exper.size();i++)
            if(vis[i]==false)
                cout<<exper[i];
        cout<<endl;
    
        return 0;
    }
    
    

    Java :

    import java.util.Arrays;
    import java.util.Scanner;
    
    public class Main {
    		public static void main(String[] args) {
    			Scanner sca=new Scanner(System.in);
    			String s=sca.next();
    			String str="";
    			int[] a=new int[s.length()];
    			for(int i=0;i<s.length();i++) {
    				char c=s.charAt(i);
    				if(a[i]==1) {
    					continue;
    				}
    				if(c=='(') {
    					boolean bo=true;
    					if(i-1>=0) {
    						if(s.charAt(i-1)=='*' || s.charAt(i-1)=='/' ) {  //判断左括号前是否有乘除
    							bo=false;
    						}
    					}
    					if(!bo) {
    						continue;
    					}
    					int index=i+1;
    					int zuo=0;
    					boolean jian=true;
    					if(i-1>=0) {
    						if(s.charAt(i-1)=='-') {  
    							jian=false;
    						}
    					}
    					while(true) {    //找到匹配的右括号
    						if(!jian && s.charAt(index)=='+') {  //判断左括号是-时,括号里有没有+
    							bo=false;
    							break;
    						}
    						if(s.charAt(index)==')' && zuo==0) {
    							break;
    						}
    						if(s.charAt(index)=='(') {
    							zuo++;
    						}
    						if(s.charAt(index)==')') {
    							zuo--;
    						}
    						index++;
    					}
    					if(!bo) {
    						continue;
    					}
    					boolean bo2=true;
    					if(index+1<s.length()) {
    						if(s.charAt(index+1)=='*' || s.charAt(index+1)=='/') {  //判断右括号右边是否有乘除
    							bo2=false;
    						}
    					}
    					if(bo2) {   //记录可以删除的括号位置
    						a[i]=1;
    						a[index]=1;
    					}
    				}
    			}
    			for(int i=0;i<s.length();i++) {
    				if(a[i]==0) {
    					str+=s.charAt(i);
    				}
    			}
    			System.out.println(str);
    		}
    	}
    	
    
    
    
    • 1

    信息

    ID
    2725
    时间
    1000ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    5
    已通过
    1
    上传者