删除算术表达式中的括号

#include<bits/stdc++.h>
using namespace std;
// ofstream __f("E:/123.txt");
// #define cout __f
//括号判断准则
// 括号前边为 “ - ”,且括号中为 “ + ” 或 “ - ”,不能删除;
// 括号前边为 “ / ”,不能删除;
// 括号后为 “ * ”,且括号中为 “ + ” 或 “ - ”,不能删除;
//   有以下几种情况是可以删除:
// 括号前和后为 “ + ” 或 “ - ”,括号中为 “ + ” 或 “ - ” 或 “ * ” 或 “ / ”,可以删除,但是注意:若括号前为 “ - ”,括号中为 “ + ” 或  “ - ”,在前边已经处理了,所以可以排除这种情况;
// 括号前为 “ * ”,括号中为 “ * ” 或 “ / ”,括号后为 “ + ” 或 “ - ” 或 “ * ” 或 “ / ”,可以删除;
//   其他情况不能删除
//去括号必须先去里面的再去外面的,递归处理
char s[300];
int n;
bool judge(int l,int r){
    int i,s1=0,s2=0;
    if(l>=1){
        if(s[l-1]=='/') return false;
        //判断+-,不算在子括号内的+-
        for(int i=l+1;i<=r;i++){
            if(s[i]=='(') break;
            if(s[i]=='+'||s[i]=='-') s1++;
            if(s[i]=='*'||s[i]=='/') s2++;
        }
        for(int i=r-1;i>=l;i--){
            if(s[i]==')') break;
            if(s[i]=='+'||s[i]=='-') s1++;
            if(s[i]=='*'||s[i]=='/') s2++;
        }
        if(s1!=0&&s[l-1]=='-') return false;
        if(s1!=0&&r<=n-2&&(s[r+1]=='*'||s[r+1]=='/')) return false;
    }
    if(l>=1&&(s[l-1]=='+'||s[l-1]=='-')) return true;
    if(r<=n-2&&(s[r+1]=='+'||s[r+1]=='-')) return true;
    if(l==0&&r==n-1) return true;
    if(r<=n-2&&(s[r+1]=='+'||s[r+1]=='-'||s[r+1]=='*'||s[r+1]=='/')){
        if(s1==0&&s2!=0) if(l>=1&&s[l-1]=='*') return true;
    }
    return false;
}
void f(int l,int r){
    int k1=-1,k2=-1,f1,f2;
    for(int i=l;i<=r;i++) if(s[i]=='('){
        k1=i;
        break;
    }
    if(k1==-1) return;//没括号
    f1=f2=0;
    f1++;
    for(int i=k1+1;i<=r;i++){
        if(s[i]=='('){
            f1++;
            // f(i,r);//递归先处理子括号,但是这样很慢
        }
        if(s[i]==')') f2++;
        if(f1==f2){
            if(judge(k1,i)){
                //可以删除
                s[i]=s[k1]=' ';
            }
            f(k1+1,i-1);//一样
            if(i+1<n&&i+1<=r)//有右边
                f(i+1,r);//对后面进行处理
            break;
        }
    }
}
int main() {
    cin>>s;
    n=strlen(s);
    f(0,n-1);
    for(int i=0;i<n;i++) if(s[i]!=' ') cout<<s[i];
    cout<<endl;
    return 0;
}

 

posted @ 2020-06-06 21:43  西伯利亚挖土豆  阅读(251)  评论(0编辑  收藏  举报